{"version":3,"file":"index.js","sources":["../../common/src/events/eventEmitter.ts","../../common/src/service/setting.service.ts","../../common/src/events/index.ts","../../common/src/config.ts","../../common/src/enums/index.ts","../../common/src/processer/index.ts","../../common/src/events/messageEmitter.ts","../src/iframes/baseIFrame.ts","../src/iframes/fieldIFrame.ts","../src/payments/utilities/index.ts","../src/payments/utilities/timeout.utility.ts","../src/iframes/apiIFrame.ts","../src/service.ts","../src/payments/card/index.ts","../src/payments/ccv/index.ts","../src/payments/wallet/index.ts","../src/payments/storedValue/index.ts","../src/payments/atm/index.ts","../src/payments/linePay/index.ts","../src/index.ts"],"sourcesContent":["import { EventHandler } from '../models/events.model';\n\nconst privateVars = new WeakMap[]> }>();\n\nclass EventEmitter {\n constructor() {\n privateVars.set(this, {\n listeners: new Map(),\n });\n }\n /**\n * 新增事件\n * @param event 事件類型\n * @param callback 事件回調\n */\n public on(event: string, callback: EventHandler) {\n privateVars.get(this).listeners.set(event, [callback]);\n }\n\n /**\n * 發送事件\n * @param event 事件類型\n * @param payload 事件回傳物件\n */\n public emit(event: string, payload?: T) {\n if (privateVars.get(this).listeners.has(event)) {\n const callbacks = privateVars.get(this).listeners.get(event);\n callbacks.forEach((callback) => {\n callback(payload);\n });\n }\n }\n\n /**\n * 刪除事件\n * @param event 事件類型\n * @param callback 事件回調\n */\n public off(event?: string, callback?: EventHandler) {\n if (!event) {\n privateVars.get(this).listeners.clear();\n } else {\n if (privateVars.get(this).listeners.has(event)) {\n if (callback) {\n const callbacks = privateVars.get(this).listeners.get(event);\n const index = callbacks.indexOf(callback);\n\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n } else {\n privateVars.get(this).listeners.delete(event);\n }\n }\n }\n }\n}\nexport default EventEmitter;\n","import { ClientData } from '../models';\n\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport { ApiResponseEntity } from '../models/api.model';\nimport { PayTypeSetting } from './types';\n\n/**\n * 取得 SDK iframe 版本設定檔\n * @param clientData\n * @returns\n */\nexport const getVersionConfig = async (\n clientData: ClientData\n): Promise<{ [key: string]: { api: string; fields: string; env: string } }> => {\n try {\n const requestUrl = `${Config.getInstance().gadgeOrigin}/api/system/settings/get-sdk-settings`;\n\n const response = await fetch(requestUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n },\n body: JSON.stringify(clientData),\n }).then((res) => res.json());\n\n return Promise.resolve(JSON.parse(response.settings));\n } catch (error) {\n return Promise.reject({\n statusCode: 'Unknown',\n message: (error as Error)?.message ?? '網路異常,無法取得 SDK Settings',\n } as ApiResponseEntity);\n }\n};\n\n/**\n * 依付款方式取得設定檔\n * @param params\n * @param {string} params.publishableKey\n * @param {string} params.payType\n * @returns\n */\nexport const getPayTypeSettings = async (params: {\n publishableKey: string;\n payType: string;\n}): Promise => {\n try {\n const { publishableKey, payType } = params;\n const requestUrl = `${Config.getInstance().gadgeOrigin}/api/system/settings/get-pay-type-settings`;\n\n const response = await fetch(requestUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n },\n body: JSON.stringify({ publishableKey, payType }),\n }).then((res) => res.json());\n\n return Promise.resolve(response);\n } catch (error) {\n return Promise.reject({\n statusCode: 'Unknown',\n message: (error as Error)?.message ?? '網路異常,無法取得 PayType Settings',\n } as ApiResponseEntity);\n }\n};\n","export const Event = {\n ON_ERROR: 'ON_ERROR',\n ON_COMPLETED: 'ON_COMPLETED',\n ON_REMOVE: 'ON_REMOVE',\n ON_UPDATE: 'ON_UPDATE',\n REMOVE: 'REMOVE',\n SYNC_CLIENT: 'SYNC_CLIENT',\n} as const;\n\nexport const CreditCardEvent = {\n GET_TXN_LAST_TOKEN: 'GET_TXN_LAST_TOKEN',\n GET_TXN_LAST_TOKEN_COMPLETED: 'GET_TXN_LAST_TOKEN_COMPLETED',\n GET_TXN_LAST_TOKEN_FAILED: 'GET_TXN_LAST_TOKEN_FAILED',\n GET_TXN_TOKEN: 'GET_TXN_TOKEN',\n GET_TXN_TOKEN_COMPLETED: 'GET_TXN_TOKEN_COMPLETED',\n GET_TXN_TOKEN_FAILED: 'GET_TXN_TOKEN_FAILED',\n} as const;\n\nexport const WalletEvent = {\n GET_TXN_TOKEN: 'WALLET_GET_TXN_TOKEN',\n GET_TXN_TOKEN_COMPLETED: 'WALLET_GET_TXN_TOKEN_COMPLETED',\n GET_TXN_TOKEN_FAILED: 'WALLET_GET_TXN_TOKEN_FAILED',\n} as const;\n\nexport const StoredValueEvent = {\n GET_TXN_TOKEN: 'STORED_VALUE_GET_TXN_TOKEN',\n GET_TXN_TOKEN_COMPLETED: 'STORED_VALUE_GET_TXN_TOKEN_COMPLETED',\n GET_TXN_TOKEN_FAILED: 'STORED_VALUE_GET_TXN_TOKEN_FAILED',\n} as const;\n\nexport const ATMEvent = {\n GET_TXN_TOKEN: 'ATM_GET_TXN_TOKEN',\n GET_TXN_TOKEN_COMPLETED: 'ATM_GET_TXN_TOKEN_COMPLETED',\n GET_TXN_TOKEN_FAILED: 'ATM_GET_TXN_TOKEN_FAILED',\n} as const;\n\nexport const LinePayEvent = {\n GET_TXN_TOKEN: 'LINE_PAY_GET_TXN_TOKEN',\n GET_TXN_TOKEN_COMPLETED: 'LINE_PAY_GET_TXN_TOKEN_COMPLETED',\n GET_TXN_TOKEN_FAILED: 'LINE_PAY_GET_TXN_TOKEN_FAILED',\n} as const;\n\nexport const FieldEvent = {\n FOCUS: 'FOCUS',\n ON_BLUR: 'ON_BLUR',\n ON_FOCUS: 'ON_FOCUS',\n RESET_ICON: 'RESET_ICON',\n SET_ICON: 'SET_ICON',\n SYNC_CARD_BRAND: 'SYNC_CARD_BRAND',\n UPDATE_CARD_BRAND: 'UPDATE_CARD_BRAND',\n UPDATE_FIELD: 'UPDATE_FIELD',\n} as const;\n","import type { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\n\nimport EventEmitter from './events/eventEmitter';\nimport { ClientData } from './models';\nimport { getVersionConfig } from './service/setting.service';\nimport { Event } from './events';\n\nconst privateVars = new WeakMap<\n Config,\n {\n emitter: EventEmitter;\n client: ClientData;\n origin: { [key: string]: { gadge: string; payPanel: string } };\n devOrigin: {\n [key in 'api' | 'fields']: string;\n };\n iframeVersion: {\n api: string;\n fields: string;\n };\n }\n>();\n\nclass Config {\n private static _instance: Config;\n public isReady: boolean;\n public isFetching: boolean;\n public error: Error;\n\n private constructor() {\n privateVars.set(this, {\n emitter: new EventEmitter(),\n client: null,\n origin: {\n production: {\n gadge: 'https://checkout.payments.91app.com',\n payPanel: 'https://pay-panel.payments.91app.com',\n },\n sandbox: {\n gadge: 'https://checkout.developer.payments.91app.com',\n payPanel: 'https://pay-panel.developer.payments.91app.com',\n },\n qa: {\n gadge: 'https://checkout.payments.qa.91dev.tw',\n payPanel: 'https://pay-panel.payments.qa.91dev.tw',\n },\n dr: {\n gadge: 'https://checkout.payments.ogdr.91app.com',\n payPanel: 'https://pay-panel.payments.ogdr.91app.com',\n },\n },\n devOrigin: {\n api: 'http://localhost:8002',\n fields: 'http://localhost:8001',\n },\n iframeVersion: {\n api: '',\n fields: '',\n },\n });\n\n this.isReady = false;\n }\n\n public static getInstance(): Config {\n if (!Config._instance) {\n Config._instance = new Config();\n }\n return Config._instance;\n }\n\n public async getVersion() {\n try {\n const response = await getVersionConfig(this.client);\n\n const { api: apiVersion, fields: fieldsVersion } = response[this.version];\n\n if (apiVersion && fieldsVersion) {\n privateVars.get(this).iframeVersion = {\n api: apiVersion,\n fields: fieldsVersion,\n };\n }\n } catch (error) {\n // NOTE: 取得 version config 若失敗,仍需使用無版號 (最新一版) 的 origin 載入 iframe\n this.error = error as Error;\n this.emitter.emit(Event.ON_ERROR, error);\n } finally {\n this.isReady = true;\n this.emitter.emit(Event.ON_COMPLETED);\n }\n }\n\n public remove() {\n this.error = null;\n }\n\n public onReady(callback: EventHandler) {\n this.emitter.on(Event.ON_COMPLETED, () => {\n callback();\n });\n }\n\n public onError(callback: EventHandler) {\n this.emitter.on(Event.ON_ERROR, (error) => {\n callback(error);\n });\n }\n\n public set client(client: ClientData) {\n privateVars.get(this).client = client;\n }\n\n public get client(): ClientData {\n return privateVars.get(this).client;\n }\n\n public get version(): string {\n return process.env.VERSION;\n }\n\n public get clientOrigin(): string {\n const origin = window.location != window.parent.location ? document.referrer : document.location.href;\n // FIXME: 暫解當 document.referrer 擷取為空字串時,轉為 * 號允許 postMessage 溝通\n return origin.length > 0 ? origin : '*';\n }\n\n public get gadgeOrigin(): string {\n return privateVars.get(this).origin[privateVars.get(this).client.serverType.toLowerCase()].gadge;\n }\n\n public get payPanelOrigin(): string {\n return privateVars.get(this).origin[privateVars.get(this).client.serverType.toLowerCase()].payPanel;\n }\n\n public get apiIFrameOrigin() {\n if (process.env.NODE_ENV === 'production') {\n const apiVersion = privateVars.get(this).iframeVersion.api;\n return `${this.payPanelOrigin}/sdk/api${apiVersion.length > 0 ? `/${apiVersion}` : ''}`;\n }\n\n return privateVars.get(this).devOrigin.api;\n }\n\n public get fieldsIFrameOrigin() {\n if (process.env.NODE_ENV === 'production') {\n const fieldsVersion = privateVars.get(this).iframeVersion.fields;\n return `${this.payPanelOrigin}/sdk/fields${fieldsVersion.length > 0 ? `/${fieldsVersion}` : ''}`;\n }\n\n return privateVars.get(this).devOrigin.fields;\n }\n\n public get emitter(): EventEmitter {\n return privateVars.get(this).emitter;\n }\n}\nexport default Config;\n","export enum CardBrand {\n Unknown = 'Unknown',\n MasterCard = 'MasterCard',\n VISA = 'VISA',\n JCB = 'JCB',\n AMEX = 'AMEX',\n UnionPay = 'UnionPay',\n}\n\nexport enum FieldStatus {\n Error = -1,\n Normal = 0,\n Success = 1,\n Changing = 2,\n}\n","type Execute = () => Promise;\n\ntype TaskOption = {\n isBreakOnError?: boolean;\n};\n\ntype ProcessErrors = Record;\n\nconst DEFAULT_TASK_OPTIONS: TaskOption = { isBreakOnError: false };\n\nexport class Task {\n public name: string | number;\n public execute: Execute;\n public options: TaskOption;\n\n constructor(config: { name: string | number; execute: Execute; options?: TaskOption }) {\n this.name = config.name;\n this.execute = config.execute;\n this.options = config.options ?? DEFAULT_TASK_OPTIONS;\n }\n\n public async run() {\n try {\n await this.execute();\n\n return Promise.resolve();\n } catch (error) {\n return Promise.reject(error);\n }\n }\n}\n\nclass Processer {\n public tasks: Task[];\n private taskIndex: number;\n private errors: ProcessErrors;\n private errorCallback: (errors?: ProcessErrors) => void;\n private completeCallback: () => void;\n\n constructor() {\n this.tasks = [];\n this.taskIndex = 0;\n this.errors = {};\n }\n\n public addTask(task: Task) {\n this.tasks.push(task);\n }\n\n private async executeTask(index: number) {\n try {\n await this.tasks[index].run();\n this.next();\n } catch (error) {\n if (error) {\n this.errors[this.tasks[index].name.toString()] = {\n error,\n break: this.tasks[index].options?.isBreakOnError ?? false,\n };\n }\n if (this.tasks[index]?.options?.isBreakOnError === true) {\n this.errorCallback?.(this.errors);\n } else {\n this.next();\n }\n }\n }\n\n public next() {\n this.taskIndex++;\n if (this.taskIndex < this.tasks.length) {\n this.executeTask(this.taskIndex);\n } else {\n this.errorCallback?.(this.errors);\n this.completeCallback?.();\n }\n }\n\n public start() {\n this.executeTask(0);\n }\n\n public onError(callback: (errors?: ProcessErrors) => void) {\n this.errorCallback = callback;\n }\n\n public onCompleted(callback: () => void) {\n this.completeCallback = callback;\n }\n}\n\nexport default Processer;\n","import { EventHandler, PostMessage } from '../models/events.model';\n\nconst privateVars = new WeakMap[]> }>();\n\nclass MessageEmitter {\n constructor(public current: Window, public target: Window, public origin: string, public key: string) {\n privateVars.set(this, {\n listeners: new Map(),\n });\n\n this.current.addEventListener('message', (evt: MessageEvent) => {\n const { type, payload } = evt.data;\n if (\n privateVars.get(this).listeners.get(type) &&\n type.split('_')[0].toLowerCase() === this.key.toLowerCase()\n ) {\n const callbacks = privateVars.get(this).listeners.get(type);\n callbacks.forEach((callback: EventHandler) => {\n callback(payload);\n });\n }\n });\n }\n\n /**\n * 增加事件\n * @param event 事件類型\n * @param callback 事件回調\n */\n public on(event: string, callback: EventHandler) {\n const prefixEvent = `${this.key.toUpperCase()}_${event}`;\n privateVars.get(this).listeners.set(prefixEvent, [callback]);\n }\n\n /**\n * 發送事件\n * @param event 事件類型\n * @param payload 事件回傳物件\n */\n public emit(event: string, payload?: T) {\n const prefixEvent = `${this.key.toUpperCase()}_${event}`;\n const message: PostMessage = {\n type: prefixEvent,\n payload,\n };\n\n if (this.target) {\n this.target.postMessage(message, this.origin);\n }\n }\n\n /**\n * 刪除事件\n * @param event 事件類型\n * @param callback 事件回調\n */\n public off(event?: string, callback?: EventHandler) {\n if (!event) {\n privateVars.get(this).listeners.clear();\n } else {\n const prefixEvent = `${this.key.toUpperCase()}_${event}`;\n\n if (privateVars.get(this).listeners.has(prefixEvent)) {\n if (callback) {\n const callbacks = privateVars.get(this).listeners.get(prefixEvent);\n const index = callbacks.indexOf(callback);\n\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n } else {\n privateVars.get(this).listeners.delete(prefixEvent);\n }\n }\n }\n }\n}\n\nexport default MessageEmitter;\n","import type { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\n\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport EventEmitter from '@91app/payment.91app.sdk.common/events/eventEmitter';\nimport MessageEmitter from '@91app/payment.91app.sdk.common/events/messageEmitter';\nimport { Event } from '@91app/payment.91app.sdk.common/events';\n\nconst privateVars = new WeakMap<\n BaseIFrame,\n {\n emitter: EventEmitter;\n messenger: MessageEmitter;\n }\n>();\n\nclass BaseIFrame {\n constructor(public element: HTMLIFrameElement, public origin: string = '*', public name: string) {\n privateVars.set(this, {\n emitter: new EventEmitter(),\n messenger: new MessageEmitter(window, this.element.contentWindow, this.origin, this.name),\n });\n\n this.element.setAttribute('sandbox', 'allow-same-origin allow-scripts');\n this.element.setAttribute('scrolling', 'no');\n this.element.setAttribute('frameborder', '0');\n this.element.setAttribute('allowtransparency', 'true');\n this.element.setAttribute('width', '100%');\n\n this.init();\n }\n\n protected init() {\n this.messenger.on(Event.ON_COMPLETED, () => {\n this.messenger.emit(Event.SYNC_CLIENT, Config.getInstance().client);\n this.emitter.emit(Event.ON_COMPLETED);\n });\n\n this.messenger.on(Event.ON_ERROR, (error) => {\n this.emitter.emit(Event.ON_ERROR, error);\n });\n }\n\n public remove() {\n if (this.messenger) {\n this.messenger.off();\n this.messenger.emit(Event.ON_REMOVE);\n }\n }\n\n public onLoaded(callback: EventHandler) {\n this.emitter.on(Event.ON_COMPLETED, () => {\n callback();\n });\n }\n\n public onError(callback: EventHandler) {\n this.emitter.on(Event.ON_ERROR, (error) => {\n callback(error);\n });\n }\n\n public get emitter(): EventEmitter {\n return privateVars.get(this).emitter;\n }\n\n public get messenger(): MessageEmitter {\n return privateVars.get(this).messenger;\n }\n}\nexport default BaseIFrame;\n","import type { IFieldUpdate } from '@91app/payment.91app.sdk.common/models/fields.model';\nimport BaseIFrame from '@91app/payment.91app.sdk/iframes/baseIFrame';\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport { CardBrand } from '@91app/payment.91app.sdk.common/enums';\nimport { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\nimport { FieldEvent } from '@91app/payment.91app.sdk.common/events';\n\nclass FieldIFrame extends BaseIFrame {\n constructor(public element: HTMLIFrameElement, public key: string) {\n super(element, Config.getInstance().fieldsIFrameOrigin, key);\n this.onUpdate = this.onUpdate.bind(this);\n this.onUpdateCardBrand = this.onUpdateCardBrand.bind(this);\n }\n\n public onUpdate(callback: EventHandler) {\n this.messenger.on(FieldEvent.UPDATE_FIELD, (response) => {\n callback(response);\n });\n }\n\n public onUpdateCardBrand(callback: EventHandler) {\n this.messenger.on(FieldEvent.UPDATE_CARD_BRAND, (response) => {\n callback(response);\n });\n }\n public onFocus(callback: EventHandler) {\n this.messenger.on(FieldEvent.ON_FOCUS, (response) => {\n callback(response);\n });\n }\n public onBlur(callback: EventHandler) {\n this.messenger.on(FieldEvent.ON_BLUR, (response) => {\n callback(response);\n });\n }\n}\nexport default FieldIFrame;\n","import type {\n SetupFields,\n SetupCreditCard,\n AllowedStyleTypes,\n AllowedCSSStyles,\n FieldType,\n} from '@91app/payment.91app.sdk.common/models/fields.model';\n\n/**\n * 驗證一般結帳信用卡欄位設定\n * @param fields\n * @returns\n */\nexport const isSetupCreditCardFieldsValid = (fields: SetupFields) => {\n return (\n fields &&\n fields.number &&\n fields.expirationDate &&\n fields.ccv &&\n Object.values(fields).find(\n (field) => !field.element || (typeof field.element !== 'string' && !(field.element instanceof HTMLElement))\n ) === undefined\n );\n};\n\n/**\n * 驗證快速結帳CCV欄位設定\n * @param fields\n * @returns\n */\nexport const isSetupCreditCardCCVFieldsValid = (fields: SetupFields) => {\n return (\n fields &&\n Object.keys(fields).length === 1 &&\n Object.keys(fields).find((key) => key !== 'ccv') === undefined &&\n Object.values(fields).find(\n (field) => !field.element || (typeof field.element !== 'string' && !(field.element instanceof HTMLElement))\n ) === undefined\n );\n};\n\n/**\n * 驗證欄位樣式類型設定\n * @param type\n * @returns\n */\nexport const isSetupCreditCardStyleTypeValid = (type: AllowedStyleTypes) => {\n const allowTypes: AllowedStyleTypes[] = ['normal', 'focus', 'error', 'success'];\n return allowTypes.includes(type);\n};\n\n/**\n * 驗證欄位 CSS 設定\n * @param type\n * @param cssStyle\n * @returns\n */\nexport const isSetupCreditCardCSSStyleValid = (type: string, cssStyle: keyof AllowedCSSStyles) => {\n const allowStyles: (keyof AllowedCSSStyles)[] =\n type === 'normal' ? ['width', 'height', 'borderColor', 'color'] : ['borderColor', 'color'];\n return allowStyles.includes(cssStyle);\n};\n\n/**\n * 信用卡 樣式、Placeholder 預設值\n * @param config\n * @returns\n */\nexport const combineDefaultSetup = (config: SetupCreditCard) => {\n // TODO 抽共用設定\n const defaultConfig: SetupCreditCard = {\n enableIcon: false,\n fields: {\n number: {\n element: null,\n placeholder: '信用卡號',\n },\n expirationDate: {\n element: null,\n placeholder: '有效期限 MM/YY',\n },\n ccv: {\n element: null,\n placeholder: '背面末三碼',\n },\n },\n styles: {\n normal: {\n width: '100%',\n height: '40px',\n color: '#000000',\n borderColor: '#DDDDDD',\n },\n focus: {\n color: '#000000',\n borderColor: '#DDDDDD',\n },\n error: {\n color: '#FF5353',\n borderColor: '#FF5353',\n },\n success: {\n color: '#000000',\n borderColor: '#DDDDDD',\n },\n },\n };\n\n const cloneConfig = {\n ...config,\n styles: config.styles ? { ...config.styles } : {},\n };\n\n Object.keys(cloneConfig.fields)\n .filter((key) => !cloneConfig.fields[key as FieldType].placeholder)\n .forEach((key) => {\n cloneConfig.fields[key as FieldType].placeholder = defaultConfig.fields[key as FieldType].placeholder;\n });\n\n Object.keys(defaultConfig.styles).forEach((key) => {\n const styleType = key as AllowedStyleTypes;\n\n if (!Object.keys(cloneConfig.styles).includes(styleType)) {\n cloneConfig.styles[styleType] = defaultConfig.styles[styleType];\n } else {\n cloneConfig.styles[styleType] = Object.assign(\n {},\n defaultConfig.styles[styleType],\n cloneConfig.styles[styleType]\n );\n }\n });\n\n return { enableIcon: config.enableIcon || defaultConfig.enableIcon, ...cloneConfig };\n};\n","export const IFRAME_LOAD_FAIL_TIME = 7000;\n\nexport const timeout = (delay: number): Promise => {\n return new Promise((resolve) => {\n const timer = window.setTimeout(() => {\n resolve();\n window.clearTimeout(timer);\n }, delay);\n });\n};\n","import BaseIFrame from '@91app/payment.91app.sdk/iframes/baseIFrame';\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport { IGetTxnTokenResponse, IGetTxnLastTokenResponse } from '@91app/payment.91app.sdk.common/models/api.model';\nimport { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\nimport { CreditCardEvent, WalletEvent, StoredValueEvent, ATMEvent, LinePayEvent } from '@91app/payment.91app.sdk.common/events';\n\nclass ApiIframe extends BaseIFrame {\n constructor(public element: HTMLIFrameElement) {\n super(element, Config.getInstance().apiIFrameOrigin, 'api');\n this.element.style.width = '1px';\n this.element.style.height = '1px';\n this.element.style.display = 'none';\n }\n\n public onGetTxnTokenCompleted(callback: EventHandler) {\n return this.messenger.on(CreditCardEvent.GET_TXN_TOKEN_COMPLETED, (response) => {\n callback(response);\n });\n }\n\n public onGetTxnTokenFailed(callback: EventHandler) {\n return this.messenger.on(CreditCardEvent.GET_TXN_TOKEN_FAILED, (response) => {\n callback(response);\n });\n }\n\n public onGetTxnLastTokenCompleted(callback: EventHandler) {\n this.messenger.on(CreditCardEvent.GET_TXN_LAST_TOKEN_COMPLETED, (response) => {\n callback(response);\n });\n }\n\n public onGetTxnLastTokenFailed(callback: EventHandler) {\n this.messenger.on(CreditCardEvent.GET_TXN_LAST_TOKEN_FAILED, (response) => {\n callback(response);\n });\n }\n\n public onGetWalletTxnTokenCompleted(callback: EventHandler) {\n return this.messenger.on(WalletEvent.GET_TXN_TOKEN_COMPLETED, (response) => {\n callback(response);\n });\n }\n\n public onGetWalletTxnTokenFailed(callback: EventHandler) {\n return this.messenger.on(WalletEvent.GET_TXN_TOKEN_FAILED, (response) => {\n callback(response);\n });\n }\n\n public onGetStoredValueTxnTokenCompleted(callback: EventHandler) {\n return this.messenger.on(StoredValueEvent.GET_TXN_TOKEN_COMPLETED, (response) => {\n callback(response);\n });\n }\n\n public onGetStoredValueTxnTokenFailed(callback: EventHandler) {\n return this.messenger.on(StoredValueEvent.GET_TXN_TOKEN_FAILED, (response) => {\n callback(response);\n });\n }\n\n public onGetATMTxnTokenCompleted(callback: EventHandler) {\n return this.messenger.on(ATMEvent.GET_TXN_TOKEN_COMPLETED, (response) => {\n callback(response);\n });\n }\n\n public onGetATMTxnTokenFailed(callback: EventHandler) {\n return this.messenger.on(ATMEvent.GET_TXN_TOKEN_FAILED, (response) => {\n callback(response);\n });\n }\n\n public onGetLinePayTxnTokenCompleted(callback: EventHandler) {\n return this.messenger.on(LinePayEvent.GET_TXN_TOKEN_COMPLETED, (response) => {\n callback(response);\n });\n }\n\n public onGetLinePayTxnTokenFailed(callback: EventHandler) {\n return this.messenger.on(LinePayEvent.GET_TXN_TOKEN_FAILED, (response) => {\n callback(response);\n });\n }\n}\n\nexport default ApiIframe;\n","import type { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\n\nimport EventEmitter from '@91app/payment.91app.sdk.common/events/eventEmitter';\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport { Event } from '@91app/payment.91app.sdk.common/events';\n\nimport ApiIframe from '@91app/payment.91app.sdk/iframes/apiIFrame';\nimport { timeout, IFRAME_LOAD_FAIL_TIME } from './payments/utilities/timeout.utility';\n\nconst IFRAME_ID = 'sdkApi';\n\nconst privateVars = new WeakMap<\n ApiService,\n {\n emitter: EventEmitter;\n iframe: ApiIframe;\n }\n>();\n\nclass ApiService {\n private static _instance: ApiService;\n public isReady: boolean;\n public error: Error;\n\n constructor() {\n privateVars.set(this, {\n emitter: new EventEmitter(),\n iframe: null,\n });\n\n this.isReady = false;\n }\n\n public static getInstance(): ApiService {\n if (!ApiService._instance) {\n ApiService._instance = new ApiService();\n }\n return ApiService._instance;\n }\n\n public async createService() {\n try {\n await this.createIframe();\n this.isReady = true;\n this.emitter.emit(Event.ON_COMPLETED);\n } catch (error) {\n this.error = error as Error;\n this.emitter.emit(Event.ON_ERROR, error);\n }\n }\n\n private createIframe(): Promise {\n return Promise.race([\n timeout(IFRAME_LOAD_FAIL_TIME).then(() => {\n return Promise.reject({\n statusCode: 'IframeLoadFailed',\n message: `Payment Sdk Api iframe 載入逾時(${IFRAME_LOAD_FAIL_TIME / 1000}s).`,\n });\n }),\n this.createIframeElement(),\n ]);\n }\n\n private createIframeElement(): Promise {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve) => {\n if (!document.getElementById(IFRAME_ID)) {\n const element = document.createElement('iframe');\n element.src = `${Config.getInstance().apiIFrameOrigin}/index.html`;\n element.id = IFRAME_ID;\n document.body.appendChild(element);\n\n const iframe = new ApiIframe(element);\n iframe.onLoaded(() => resolve());\n\n privateVars.get(this).iframe = iframe;\n } else {\n resolve();\n }\n });\n }\n\n public onReady(callback: EventHandler) {\n this.emitter.on(Event.ON_COMPLETED, () => {\n callback();\n });\n }\n\n public onError(callback: EventHandler) {\n this.emitter.on(Event.ON_ERROR, (error) => {\n callback(error);\n });\n }\n\n public remove() {\n this.error = null;\n\n if (privateVars.get(this).emitter) {\n privateVars.get(this).emitter.off();\n }\n\n if (privateVars.get(this).iframe) {\n privateVars.get(this).iframe.remove();\n }\n }\n\n public get emitter(): EventEmitter {\n return privateVars.get(this).emitter;\n }\n\n public get iframe(): ApiIframe {\n return privateVars.get(this).iframe;\n }\n}\n\nexport default ApiService;\n","import type { IFieldParams, IFieldUpdate } from '@91app/payment.91app.sdk.common/models/fields.model';\nimport type { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\nimport type { IGetTxnTokenResponse, IGetTxnTokenRequest } from '@91app/payment.91app.sdk.common/models/api.model';\nimport type {\n AllowedStyleTypes,\n AllowedCSSStyles,\n FieldType,\n SetupCreditCard,\n} from '@91app/payment.91app.sdk.common/models/fields.model';\nimport type { ICreditCard, ICreditCardUpdate } from '@91app/payment.91app.sdk/payments/models/card.model';\n\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport EventEmitter from '@91app/payment.91app.sdk.common/events/eventEmitter';\nimport { CardBrand, FieldStatus } from '@91app/payment.91app.sdk.common/enums';\nimport Processer, { Task } from '@91app/payment.91app.sdk.common/processer';\nimport { Event, FieldEvent, CreditCardEvent } from '@91app/payment.91app.sdk.common/events';\n\nimport FieldIFrame from '@91app/payment.91app.sdk/iframes/fieldIFrame';\nimport {\n isSetupCreditCardFieldsValid,\n isSetupCreditCardCSSStyleValid,\n isSetupCreditCardStyleTypeValid,\n combineDefaultSetup,\n} from '@91app/payment.91app.sdk/payments/utilities';\nimport { timeout, IFRAME_LOAD_FAIL_TIME } from '@91app/payment.91app.sdk/payments/utilities/timeout.utility';\nimport ApiService from '@91app/payment.91app.sdk/service';\n\nconst privateVars = new WeakMap<\n CreditCard,\n {\n card: ICreditCard;\n config: SetupCreditCard;\n emitter: EventEmitter;\n }\n>();\n\nconst DEFAULT_CREDIT_CARD: ICreditCard = {\n canGetToken: false,\n cardBrand: CardBrand.Unknown,\n enableIcon: false,\n fields: {\n number: {\n target: null,\n status: FieldStatus.Normal,\n value: '',\n errorMessage: '',\n },\n expirationDate: {\n target: null,\n status: FieldStatus.Normal,\n value: '',\n errorMessage: '',\n },\n ccv: {\n target: null,\n status: FieldStatus.Normal,\n value: '',\n errorMessage: '',\n },\n },\n};\n\nclass CreditCard {\n constructor() {\n privateVars.set(this, {\n card: DEFAULT_CREDIT_CARD,\n emitter: new EventEmitter(),\n config: null,\n });\n }\n\n public setup(config: SetupCreditCard) {\n privateVars.get(this).config = combineDefaultSetup(config);\n\n this.remove();\n this.init();\n }\n\n private init() {\n this.createProcesser();\n }\n\n private createProcesser() {\n const processer = new Processer();\n\n processer.addTask(\n new Task({\n name: 'checkConfig',\n execute: this.checkConfig.bind(this),\n options: { isBreakOnError: false },\n })\n );\n processer.addTask(\n new Task({\n name: 'checkApiService',\n execute: this.checkApiService.bind(this),\n options: { isBreakOnError: true },\n })\n );\n processer.addTask(\n new Task({\n name: 'clientVaildation',\n execute: this.clientVaildation.bind(this),\n options: { isBreakOnError: true },\n })\n );\n processer.addTask(\n new Task({\n name: 'fieldsVaildation',\n execute: this.fieldsVaildation.bind(this),\n })\n );\n processer.addTask(\n new Task({\n name: 'styleVaildation',\n execute: this.styleVaildation.bind(this),\n })\n );\n processer.addTask(\n new Task({\n name: 'createNumberField',\n execute: this.createNumberField.bind(this),\n options: { isBreakOnError: true },\n })\n );\n processer.addTask(\n new Task({\n name: 'createExpirationDateField',\n execute: this.createExpirationDateField.bind(this),\n options: { isBreakOnError: true },\n })\n );\n processer.addTask(\n new Task({\n name: 'createCCVField',\n execute: this.createCCVField.bind(this),\n options: { isBreakOnError: true },\n })\n );\n\n processer.onCompleted(() => {\n privateVars.get(this).emitter.emit(Event.ON_COMPLETED);\n });\n\n processer.onError((errors) => {\n Object.values(errors).forEach((item) => {\n privateVars.get(this).emitter.emit(Event.ON_ERROR, item.error);\n });\n });\n\n processer.start();\n }\n\n private clientVaildation(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().client) {\n reject(new Error('[SDK] please run SDK.setupSDK(publishableKey, serverType) first.'));\n } else {\n resolve();\n }\n });\n }\n\n private fieldsVaildation(): Promise {\n return new Promise((resolve, reject) => {\n if (!isSetupCreditCardFieldsValid(privateVars.get(this).config.fields)) {\n reject(new Error('[SDK] setup field element is incorrect.'));\n } else {\n resolve();\n }\n });\n }\n\n private styleVaildation(): Promise {\n return new Promise((resolve, reject) => {\n Object.entries(privateVars.get(this).config.styles).forEach(([type, styles]) => {\n if (!isSetupCreditCardStyleTypeValid(type as AllowedStyleTypes)) {\n reject(new Error(`[SDK] setup style type \"${type}\" is not allowed.`));\n }\n Object.keys(styles).forEach((key) => {\n if (!isSetupCreditCardCSSStyleValid(type, key as keyof AllowedCSSStyles)) {\n reject(new Error(`[SDK] setup css style \"${key}\" is not allowed.`));\n }\n });\n });\n\n resolve();\n });\n }\n\n private checkConfig(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().isReady) {\n Config.getInstance().onReady(() => {\n resolve();\n });\n Config.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (Config.getInstance().error) {\n reject(Config.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n private checkApiService(): Promise {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n if (!ApiService.getInstance().isReady) {\n ApiService.getInstance().onReady(() => {\n resolve();\n });\n ApiService.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (ApiService.getInstance().error) {\n reject(ApiService.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n private createNumberField(): Promise {\n return Promise.race([\n timeout(IFRAME_LOAD_FAIL_TIME).then(() => {\n return Promise.reject(\n new Error(`Credit card number iframe 載入逾時(${IFRAME_LOAD_FAIL_TIME / 1000}s).`)\n );\n }),\n this.createIframe('number', privateVars.get(this).config.fields.number),\n ]);\n }\n\n private createExpirationDateField(): Promise {\n return Promise.race([\n timeout(IFRAME_LOAD_FAIL_TIME).then(() => {\n return Promise.reject(\n new Error(`Credit card expirationDate iframe 載入逾時(${IFRAME_LOAD_FAIL_TIME / 1000}s).`)\n );\n }),\n this.createIframe('expirationDate', privateVars.get(this).config.fields.expirationDate),\n ]);\n }\n\n private createCCVField(): Promise {\n return Promise.race([\n timeout(IFRAME_LOAD_FAIL_TIME).then(() => {\n return Promise.reject({\n statusCode: 'IframeLoadFailed',\n message: `Credit card ccv iframe 載入逾時(${IFRAME_LOAD_FAIL_TIME / 1000}s).`,\n });\n }),\n this.createIframe('ccv', privateVars.get(this).config.fields.ccv),\n ]);\n }\n\n private createIframe(\n type: FieldType,\n field: {\n element: string | HTMLElement;\n placeholder?: string;\n }\n ): Promise {\n return new Promise((resolve, reject) => {\n try {\n const styles = privateVars.get(this).config.styles;\n const enableIcon = privateVars.get(this).config.enableIcon || false;\n\n const element = document.createElement('iframe');\n const params: string = encodeURIComponent(\n JSON.stringify({\n type,\n enableIcon,\n placeholder: field.placeholder,\n styles: styles,\n } as IFieldParams)\n );\n element.src = `${Config.getInstance().fieldsIFrameOrigin}/index.html?${params}`;\n element.name = type;\n element.width = styles.normal.width;\n element.height = styles.normal.height ?? '40px';\n\n const parent =\n typeof field.element === 'string'\n ? document.querySelector(field.element.toString())\n : field.element;\n\n if (parent) {\n parent.innerHTML = '';\n parent.appendChild(element);\n }\n\n\n const iframe = new FieldIFrame(element, type);\n privateVars.get(this).card.fields[type].target = iframe;\n\n iframe.onUpdate((result) => {\n if (result.type === type) {\n this.updateCreditCard(result);\n }\n });\n\n iframe.onUpdateCardBrand((cardBrand: CardBrand) => {\n if (cardBrand !== privateVars.get(this).card.cardBrand) {\n privateVars.get(this).card.cardBrand = cardBrand;\n privateVars\n .get(this)\n .card.fields.ccv.target.messenger.emit(FieldEvent.SYNC_CARD_BRAND, cardBrand);\n }\n });\n\n iframe.onFocus(() => {\n if (type === 'ccv' && enableIcon) {\n privateVars.get(this).card.fields.number.target.messenger.emit(FieldEvent.SET_ICON, 'ccv');\n }\n });\n\n iframe.onBlur(() => {\n if (type === 'ccv' && enableIcon) {\n privateVars.get(this).card.fields.number.target.messenger.emit(FieldEvent.RESET_ICON);\n }\n });\n\n iframe.onLoaded(() => {\n resolve();\n });\n\n iframe.onError((error) => {\n privateVars.get(this).emitter.emit(Event.ON_ERROR, error);\n });\n } catch (error) {\n reject(error);\n }\n });\n }\n\n private updateCreditCard(result: IFieldUpdate) {\n privateVars.get(this).card = {\n ...privateVars.get(this).card,\n fields: {\n ...privateVars.get(this).card.fields,\n [result.type]: {\n ...privateVars.get(this).card.fields[result.type],\n status: result.status,\n value: result.value,\n errorMessage: result.errorMessage,\n },\n },\n };\n\n this.focusToNextField(result.type as FieldType);\n\n privateVars.get(this).emitter.emit(Event.ON_UPDATE);\n }\n\n /**\n * 填寫完成移至下一輸入框\n * @param type\n */\n private focusToNextField(type: FieldType) {\n const fields = privateVars.get(this).card.fields;\n\n const isFieldCompleted =\n fields[type].status === FieldStatus.Success ||\n (fields[type].status === FieldStatus.Changing && !fields[type].errorMessage?.length);\n\n const fieldKeys = Object.keys(fields) as (keyof typeof fields)[];\n\n if (isFieldCompleted) {\n const currentIndex = fieldKeys.findIndex((key) => key === type);\n\n if (currentIndex + 1 < fieldKeys.length) {\n const nextType = fieldKeys[currentIndex + 1];\n const nextField = fields[nextType];\n\n if (nextField.status === FieldStatus.Success) {\n this.focusToNextField(nextType);\n } else {\n nextField.target.messenger.emit(FieldEvent.FOCUS);\n }\n }\n }\n }\n\n public getTxnToken(callback?: EventHandler) {\n const fields = privateVars.get(this).card.fields;\n\n const data: IGetTxnTokenRequest = {\n publishableKey: Config.getInstance().client.publishableKey,\n sdkVer: Config.getInstance().version,\n cardNumber: fields.number.value,\n cardExpiryDate: fields.expirationDate.value,\n cardSecurityCode: fields.ccv.value,\n apiOrigin: Config.getInstance().payPanelOrigin,\n };\n\n ApiService.getInstance().iframe.onGetTxnTokenCompleted(callback);\n\n ApiService.getInstance().iframe.onGetTxnTokenFailed((error) => {\n callback(error);\n privateVars.get(this).emitter.emit(Event.ON_ERROR, error);\n });\n\n ApiService.getInstance().iframe.messenger.emit(CreditCardEvent.GET_TXN_TOKEN, data);\n }\n\n public onUpdate(callback?: EventHandler) {\n privateVars.get(this).emitter.on(Event.ON_UPDATE, () => {\n const fields = privateVars.get(this).card.fields;\n const update: ICreditCardUpdate = {\n ...privateVars.get(this).card,\n canGetToken:\n Object.values(privateVars.get(this).card.fields).find((field) => {\n return field.status !== FieldStatus.Success;\n }) === undefined,\n fields: {\n number: {\n status: fields.number.status,\n errorMessage: fields.number.errorMessage,\n },\n expirationDate: {\n status: fields.expirationDate.status,\n errorMessage: fields.expirationDate.errorMessage,\n },\n ccv: {\n status: fields.ccv.status,\n errorMessage: fields.ccv.errorMessage,\n },\n },\n };\n callback(update);\n });\n }\n\n public onError(callback: EventHandler) {\n privateVars.get(this).emitter.on(Event.ON_ERROR, (error) => {\n callback(error);\n });\n }\n\n public onReady(callback: EventHandler) {\n privateVars.get(this).emitter.on(Event.ON_COMPLETED, () => {\n callback();\n });\n }\n\n public reset() {\n this.remove();\n this.init();\n }\n\n public remove() {\n privateVars.get(this).card = DEFAULT_CREDIT_CARD;\n\n ApiService.getInstance().remove();\n\n if (privateVars.get(this).emitter) {\n privateVars.get(this).emitter.off();\n }\n\n if (privateVars.get(this).card.fields) {\n Object.values(privateVars.get(this).card.fields).forEach((field) => {\n if (field.target) {\n field.target.remove();\n }\n });\n }\n }\n}\n\nexport default CreditCard;\n","import type { IFieldParams, IFieldUpdate } from '@91app/payment.91app.sdk.common/models/fields.model';\nimport type { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\nimport type {\n IGetTxnLastTokenRequest,\n IGetTxnLastTokenResponse,\n} from '@91app/payment.91app.sdk.common/models/api.model';\nimport type {\n AllowedStyleTypes,\n AllowedCSSStyles,\n SetupCreditCard,\n} from '@91app/payment.91app.sdk.common/models/fields.model';\nimport type { ICreditCard, ICreditCardUpdate } from '@91app/payment.91app.sdk/payments/models/card.model';\n\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport EventEmitter from '@91app/payment.91app.sdk.common/events/eventEmitter';\nimport { CardBrand, FieldStatus } from '@91app/payment.91app.sdk.common/enums';\nimport {\n combineDefaultSetup,\n isSetupCreditCardCCVFieldsValid,\n isSetupCreditCardCSSStyleValid,\n isSetupCreditCardStyleTypeValid,\n} from '@91app/payment.91app.sdk/payments/utilities';\nimport Processer, { Task } from '@91app/payment.91app.sdk.common/processer';\nimport { Event, FieldEvent, CreditCardEvent } from '@91app/payment.91app.sdk.common/events';\n\nimport FieldIFrame from '@91app/payment.91app.sdk/iframes/fieldIFrame';\nimport ApiService from '@91app/payment.91app.sdk/service';\nimport { timeout, IFRAME_LOAD_FAIL_TIME } from '@91app/payment.91app.sdk/payments/utilities/timeout.utility';\n\nconst privateVars = new WeakMap<\n CreditCardCCV,\n {\n emitter: EventEmitter;\n config: SetupCreditCard;\n card: ICreditCard;\n }\n>();\n\nconst DEFAULT_CREDIT_CARD: ICreditCard = {\n enableIcon: false,\n canGetToken: false,\n cardBrand: CardBrand.Unknown,\n fields: {\n ccv: {\n target: null,\n status: FieldStatus.Normal,\n value: '',\n errorMessage: '',\n },\n },\n};\n\nclass CreditCardCCV {\n constructor() {\n privateVars.set(this, {\n emitter: new EventEmitter(),\n config: null,\n card: DEFAULT_CREDIT_CARD,\n });\n }\n\n public setup(config: SetupCreditCard) {\n privateVars.get(this).config = combineDefaultSetup(config);\n\n this.remove();\n this.init();\n }\n\n private init() {\n this.createProcesser();\n }\n\n private createProcesser() {\n const processer = new Processer();\n\n processer.addTask(\n new Task({\n name: 'checkConfig',\n execute: this.checkConfig.bind(this),\n options: { isBreakOnError: false },\n })\n );\n processer.addTask(\n new Task({\n name: 'checkApiService',\n execute: this.checkApiService.bind(this),\n options: { isBreakOnError: true },\n })\n );\n processer.addTask(\n new Task({\n name: 'clientVaildation',\n execute: this.clientVaildation.bind(this),\n options: { isBreakOnError: true },\n })\n );\n processer.addTask(\n new Task({\n name: 'fieldsVaildation',\n execute: this.fieldsVaildation.bind(this),\n })\n );\n processer.addTask(\n new Task({\n name: 'styleVaildation',\n execute: this.styleVaildation.bind(this),\n })\n );\n processer.addTask(\n new Task({\n name: 'createField',\n execute: this.createField.bind(this),\n options: { isBreakOnError: true },\n })\n );\n\n processer.onCompleted(() => {\n privateVars.get(this).emitter.emit(Event.ON_COMPLETED);\n });\n\n processer.onError((errors) => {\n Object.values(errors).forEach((item) => {\n privateVars.get(this).emitter.emit(Event.ON_ERROR, item.error);\n });\n });\n\n processer.start();\n }\n\n private clientVaildation(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().client) {\n reject(new Error('[SDK] please run SDK.setupSDK(publishableKey, serverType) first.'));\n } else {\n resolve();\n }\n });\n }\n\n private fieldsVaildation(): Promise {\n return new Promise((resolve, reject) => {\n if (!isSetupCreditCardCCVFieldsValid(privateVars.get(this).config.fields)) {\n reject(new Error('[SDK] setup field element is incorrect.'));\n } else {\n resolve();\n }\n });\n }\n\n private styleVaildation(): Promise {\n return new Promise((resolve, reject) => {\n Object.entries(privateVars.get(this).config.styles).forEach(([type, styles]) => {\n if (!isSetupCreditCardStyleTypeValid(type as AllowedStyleTypes)) {\n reject(new Error(`[SDK] setup style type \"${type}\" is not allowed.`));\n }\n Object.keys(styles).forEach((key) => {\n if (!isSetupCreditCardCSSStyleValid(type, key as keyof AllowedCSSStyles)) {\n reject(new Error(`[SDK] setup css style \"${key}\" is not allowed.`));\n }\n });\n });\n\n resolve();\n });\n }\n\n private checkConfig(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().isReady) {\n Config.getInstance().onReady(() => {\n resolve();\n });\n Config.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (Config.getInstance().error) {\n reject(Config.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n private checkApiService(): Promise {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n if (!ApiService.getInstance().isReady) {\n ApiService.getInstance().onReady(() => {\n resolve();\n });\n ApiService.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (ApiService.getInstance().error) {\n reject(ApiService.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n private createField(): Promise {\n return Promise.race([\n timeout(IFRAME_LOAD_FAIL_TIME).then(() => {\n return Promise.reject({\n statusCode: 'IframeLoadFailed',\n message: `CCV iframe 載入逾時(${IFRAME_LOAD_FAIL_TIME / 1000}s).`,\n });\n }),\n this.createIframe(),\n ]);\n }\n\n private createIframe(): Promise {\n return new Promise((resolve, reject) => {\n try {\n const field = privateVars.get(this).config.fields.ccv;\n const styles = privateVars.get(this).config.styles;\n\n const element = document.createElement('iframe');\n const params: string = encodeURIComponent(\n JSON.stringify({\n type: 'ccv',\n placeholder: field.placeholder,\n styles: styles,\n } as IFieldParams)\n );\n element.src = `${Config.getInstance().fieldsIFrameOrigin}/index.html?${params}`;\n element.name = `ccv`;\n element.width = styles.normal.width;\n element.height = styles.normal.height ?? '40px';\n\n const parent =\n typeof field.element === 'string'\n ? document.querySelector(field.element.toString())\n : field.element;\n\n if (parent) {\n parent.innerHTML = '';\n parent.appendChild(element);\n }\n\n const iframe = new FieldIFrame(element, 'ccv');\n privateVars.get(this).card.fields.ccv.target = iframe;\n\n iframe.onLoaded(() => {\n iframe.messenger.emit(FieldEvent.SYNC_CARD_BRAND, privateVars.get(this).card.cardBrand);\n resolve();\n });\n\n iframe.onError((error) => {\n privateVars.get(this).emitter.emit(Event.ON_ERROR, error);\n });\n\n iframe.onUpdate(this.updateCreditCard.bind(this));\n } catch (error) {\n reject(error);\n }\n });\n }\n\n private updateCreditCard(result: IFieldUpdate) {\n privateVars.get(this).card = {\n ...privateVars.get(this).card,\n fields: {\n ccv: {\n ...privateVars.get(this).card.fields.ccv,\n status: result.status,\n value: result.value,\n errorMessage: result.errorMessage,\n },\n },\n };\n\n privateVars.get(this).emitter.emit(Event.ON_UPDATE);\n }\n\n public setCardBrand(brand: CardBrand) {\n const allowedCardBrand = [\n CardBrand.Unknown,\n CardBrand.AMEX,\n CardBrand.JCB,\n CardBrand.MasterCard,\n CardBrand.UnionPay,\n CardBrand.VISA,\n ].find((value) => value.toLowerCase() === brand.toLowerCase()) as CardBrand;\n\n privateVars.get(this).card.cardBrand = allowedCardBrand !== undefined ? allowedCardBrand : CardBrand.Unknown;\n\n const field = privateVars.get(this).card.fields.ccv.target;\n if (field) {\n field.messenger.emit(FieldEvent.SYNC_CARD_BRAND, privateVars.get(this).card.cardBrand);\n }\n }\n\n public getTxnLastToken(callback: EventHandler) {\n const fields = privateVars.get(this).card.fields;\n\n const data: IGetTxnLastTokenRequest = {\n publishableKey: Config.getInstance().client.publishableKey,\n sdkVer: Config.getInstance().version,\n cardBrand: privateVars.get(this).card.cardBrand,\n cardSecurityCode: fields.ccv.value,\n apiOrigin: Config.getInstance().payPanelOrigin,\n };\n\n ApiService.getInstance().iframe.onGetTxnLastTokenCompleted(callback);\n\n ApiService.getInstance().iframe.onGetTxnLastTokenFailed((error) => {\n callback(error);\n privateVars.get(this).emitter.emit(Event.ON_ERROR, error);\n });\n\n ApiService.getInstance().iframe.messenger.emit(CreditCardEvent.GET_TXN_LAST_TOKEN, data);\n }\n\n public onUpdate(callback: EventHandler) {\n privateVars.get(this).emitter.on(Event.ON_UPDATE, () => {\n const field = privateVars.get(this).card.fields.ccv;\n const update: ICreditCardUpdate = {\n ...privateVars.get(this).card,\n canGetToken: field.status === FieldStatus.Success,\n fields: {\n ccv: {\n status: field.status,\n errorMessage: field.errorMessage,\n },\n },\n };\n callback(update);\n });\n }\n\n public onError(callback: EventHandler) {\n privateVars.get(this).emitter.on(Event.ON_ERROR, (error) => {\n callback(error);\n });\n }\n\n public onReady(callback: EventHandler) {\n privateVars.get(this).emitter.on(Event.ON_COMPLETED, () => {\n callback();\n });\n }\n\n public reset() {\n this.remove();\n this.init();\n }\n\n public remove() {\n privateVars.get(this).card = DEFAULT_CREDIT_CARD;\n\n ApiService.getInstance().remove();\n\n if (privateVars.get(this).emitter) {\n privateVars.get(this).emitter.off();\n }\n\n if (privateVars.get(this).card.fields) {\n Object.values(privateVars.get(this).card.fields).forEach((field) => {\n if (field.target) {\n field.target.remove();\n }\n });\n }\n }\n}\n\nexport default CreditCardCCV;\n","import type { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\nimport type { IGetTxnTokenResponse, IWalletGetTxnTokenRequest } from '@91app/payment.91app.sdk.common/models/api.model';\n\nimport ApiIframe from '@91app/payment.91app.sdk/iframes/apiIFrame';\nimport ApiService from '@91app/payment.91app.sdk/service';\n\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport EventEmitter from '@91app/payment.91app.sdk.common/events/eventEmitter';\nimport Processer, { Task } from '@91app/payment.91app.sdk.common/processer';\nimport { Event, WalletEvent } from '@91app/payment.91app.sdk.common/events';\n\nconst privateVars = new WeakMap<\n Wallet,\n {\n emitter: EventEmitter;\n api: ApiIframe;\n callback?: EventHandler;\n }\n>();\n\nclass Wallet {\n constructor() {\n privateVars.set(this, {\n emitter: new EventEmitter(),\n api: null,\n callback: null,\n });\n }\n\n private init() {\n this.createProcesser();\n }\n\n public createProcesser() {\n const processer = new Processer();\n\n processer.addTask(\n new Task({\n name: 'checkConfig',\n execute: this.checkConfig.bind(this),\n options: { isBreakOnError: false },\n })\n );\n processer.addTask(\n new Task({\n name: 'checkApiService',\n execute: this.checkApiService.bind(this),\n options: { isBreakOnError: true },\n })\n );\n processer.addTask(\n new Task({\n name: 'clientVaildation',\n execute: this.clientVaildation.bind(this),\n options: { isBreakOnError: true },\n })\n );\n\n processer.onCompleted(() => {\n this.callService(privateVars.get(this).callback);\n });\n\n processer.onError((errors) => {\n Object.values(errors).forEach((item) => {\n privateVars.get(this).emitter.emit(Event.ON_ERROR, item.error);\n });\n });\n\n processer.start();\n }\n\n private clientVaildation(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().client) {\n reject(new Error('[SDK] please run SDK.setupSDK(publishableKey, serverType) first.'));\n } else {\n resolve();\n }\n });\n }\n\n private checkConfig(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().isReady) {\n Config.getInstance().onReady(() => {\n resolve();\n });\n Config.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (Config.getInstance().error) {\n reject(Config.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n private checkApiService(): Promise {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n if (!ApiService.getInstance().isReady) {\n ApiService.getInstance().onReady(() => {\n resolve();\n });\n ApiService.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (ApiService.getInstance().error) {\n reject(ApiService.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n public async getTxnToken(callback?: EventHandler) {\n this.remove();\n this.init();\n\n privateVars.get(this).callback = callback;\n }\n\n private callService(callback?: EventHandler) {\n const data: IWalletGetTxnTokenRequest = {\n publishableKey: Config.getInstance().client.publishableKey,\n sdkVer: Config.getInstance().version,\n apiOrigin: Config.getInstance().payPanelOrigin,\n };\n\n ApiService.getInstance().iframe.onGetWalletTxnTokenCompleted(callback);\n\n ApiService.getInstance().iframe.onGetWalletTxnTokenFailed((error) => {\n callback(error);\n privateVars.get(this).emitter.emit(Event.ON_ERROR, error);\n });\n\n ApiService.getInstance().iframe.messenger.emit(WalletEvent.GET_TXN_TOKEN, data);\n }\n\n public onError(callback: EventHandler) {\n privateVars.get(this).emitter.on(Event.ON_ERROR, (error) => {\n callback(error);\n });\n }\n\n public remove = () => {\n ApiService.getInstance().remove();\n\n if (privateVars.get(this).emitter) {\n privateVars.get(this).emitter.off();\n }\n };\n}\n\nexport default Wallet;\n","import type { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\nimport type {\n IGetTxnTokenResponse,\n IStoredValueGetTxnTokenRequest,\n} from '@91app/payment.91app.sdk.common/models/api.model';\n\nimport ApiIframe from '@91app/payment.91app.sdk/iframes/apiIFrame';\nimport ApiService from '@91app/payment.91app.sdk/service';\n\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport EventEmitter from '@91app/payment.91app.sdk.common/events/eventEmitter';\nimport Processer, { Task } from '@91app/payment.91app.sdk.common/processer';\nimport { Event, StoredValueEvent } from '@91app/payment.91app.sdk.common/events';\n\nconst privateVars = new WeakMap<\n StoredValue,\n {\n emitter: EventEmitter;\n api: ApiIframe;\n callback?: EventHandler;\n }\n>();\n\nclass StoredValue {\n constructor() {\n privateVars.set(this, {\n emitter: new EventEmitter(),\n api: null,\n callback: null,\n });\n }\n\n private init() {\n this.createProcesser();\n }\n\n public createProcesser() {\n const processer = new Processer();\n\n processer.addTask(\n new Task({\n name: 'checkConfig',\n execute: this.checkConfig.bind(this),\n options: { isBreakOnError: false },\n })\n );\n processer.addTask(\n new Task({\n name: 'checkApiService',\n execute: this.checkApiService.bind(this),\n options: { isBreakOnError: true },\n })\n );\n processer.addTask(\n new Task({\n name: 'clientVaildation',\n execute: this.clientVaildation.bind(this),\n options: { isBreakOnError: true },\n })\n );\n\n processer.onCompleted(() => {\n this.callService(privateVars.get(this).callback);\n });\n\n processer.onError((errors) => {\n Object.values(errors).forEach((item) => {\n privateVars.get(this).emitter.emit(Event.ON_ERROR, item.error);\n });\n });\n\n processer.start();\n }\n\n private clientVaildation(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().client) {\n reject(new Error('[SDK] please run SDK.setupSDK(publishableKey, serverType) first.'));\n } else {\n resolve();\n }\n });\n }\n\n private checkConfig(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().isReady) {\n Config.getInstance().onReady(() => {\n resolve();\n });\n Config.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (Config.getInstance().error) {\n reject(Config.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n private checkApiService(): Promise {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n if (!ApiService.getInstance().isReady) {\n ApiService.getInstance().onReady(() => {\n resolve();\n });\n ApiService.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (ApiService.getInstance().error) {\n reject(ApiService.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n public async getTxnToken(callback?: EventHandler) {\n this.remove();\n this.init();\n\n privateVars.get(this).callback = callback;\n }\n\n private callService(callback?: EventHandler) {\n const data: IStoredValueGetTxnTokenRequest = {\n publishableKey: Config.getInstance().client.publishableKey,\n sdkVer: Config.getInstance().version,\n apiOrigin: Config.getInstance().payPanelOrigin,\n };\n\n ApiService.getInstance().iframe.onGetStoredValueTxnTokenCompleted(callback);\n\n ApiService.getInstance().iframe.onGetStoredValueTxnTokenFailed((error) => {\n callback(error);\n privateVars.get(this).emitter.emit(Event.ON_ERROR, error);\n });\n\n ApiService.getInstance().iframe.messenger.emit(StoredValueEvent.GET_TXN_TOKEN, data);\n }\n\n public onError(callback: EventHandler) {\n privateVars.get(this).emitter.on(Event.ON_ERROR, (error) => {\n callback(error);\n });\n }\n\n public remove = () => {\n ApiService.getInstance().remove();\n\n if (privateVars.get(this).emitter) {\n privateVars.get(this).emitter.off();\n }\n };\n}\n\nexport default StoredValue;\n","import type { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\nimport type { IATMGetTxnTokenRequest, IGetTxnTokenResponse } from '@91app/payment.91app.sdk.common/models/api.model';\n\nimport ApiIframe from '@91app/payment.91app.sdk/iframes/apiIFrame';\nimport ApiService from '@91app/payment.91app.sdk/service';\n\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport EventEmitter from '@91app/payment.91app.sdk.common/events/eventEmitter';\nimport Processer, { Task } from '@91app/payment.91app.sdk.common/processer';\nimport { ATMEvent, Event } from '@91app/payment.91app.sdk.common/events';\nimport { getPayTypeSettings } from '@91app/payment.91app.sdk.common/service/setting.service';\nimport { PayTypeSetting } from '@91app/payment.91app.sdk.common/service/types';\n\nconst privateVars = new WeakMap<\n ATM,\n {\n emitter: EventEmitter;\n api: ApiIframe;\n callback?: EventHandler;\n }\n>();\n\nclass ATM {\n constructor() {\n privateVars.set(this, {\n emitter: new EventEmitter(),\n api: null,\n callback: null,\n });\n }\n\n private init() {\n this.createProcesser();\n }\n\n public createProcesser() {\n const processer = new Processer();\n\n processer.addTask(\n new Task({\n name: 'checkConfig',\n execute: this.checkConfig.bind(this),\n options: { isBreakOnError: false },\n })\n );\n processer.addTask(\n new Task({\n name: 'checkApiService',\n execute: this.checkApiService.bind(this),\n options: { isBreakOnError: true },\n })\n );\n processer.addTask(\n new Task({\n name: 'clientVaildation',\n execute: this.clientVaildation.bind(this),\n options: { isBreakOnError: true },\n })\n );\n\n processer.onCompleted(() => {\n privateVars.get(this).emitter.emit(Event.ON_COMPLETED);\n });\n\n processer.onError((errors) => {\n Object.values(errors).forEach((item) => {\n privateVars.get(this).emitter.emit(Event.ON_ERROR, item.error);\n });\n });\n\n processer.start();\n }\n\n private clientVaildation(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().client) {\n reject(new Error('[SDK] please run SDK.setupSDK(publishableKey, serverType) first.'));\n } else {\n resolve();\n }\n });\n }\n\n private checkConfig(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().isReady) {\n Config.getInstance().onReady(() => {\n resolve();\n });\n Config.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (Config.getInstance().error) {\n reject(Config.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n private checkApiService(): Promise {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n if (!ApiService.getInstance().isReady) {\n ApiService.getInstance().onReady(() => {\n resolve();\n });\n ApiService.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (ApiService.getInstance().error) {\n reject(ApiService.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n public async getTxnToken(callback?: EventHandler) {\n const emitter = privateVars.get(this).emitter;\n\n const onInitCompleted = () => {\n this.callService(callback);\n emitter.off(Event.ON_COMPLETED, onInitCompleted);\n };\n\n emitter.on(Event.ON_COMPLETED, onInitCompleted);\n\n this.init();\n }\n\n private callService(callback?: EventHandler) {\n const data: IATMGetTxnTokenRequest = {\n publishableKey: Config.getInstance().client.publishableKey,\n sdkVer: Config.getInstance().version,\n apiOrigin: Config.getInstance().payPanelOrigin,\n };\n\n ApiService.getInstance().iframe.onGetATMTxnTokenCompleted(callback);\n\n ApiService.getInstance().iframe.onGetATMTxnTokenFailed((error) => {\n callback(error);\n privateVars.get(this).emitter.emit(Event.ON_ERROR, error);\n });\n\n ApiService.getInstance().iframe.messenger.emit(ATMEvent.GET_TXN_TOKEN, data);\n }\n\n public getSupportedBanks(callback: EventHandler) {\n const emitter = privateVars.get(this).emitter;\n\n const onInitCompleted = () => {\n getPayTypeSettings({\n publishableKey: Config.getInstance().client?.publishableKey,\n payType: 'ATM',\n })\n .then((result) => {\n callback(result.data);\n })\n .catch((error) => {\n callback(error);\n privateVars.get(this).emitter.emit(Event.ON_ERROR, error);\n })\n .finally(() => {\n emitter.off(Event.ON_COMPLETED, onInitCompleted);\n });\n };\n\n emitter.on(Event.ON_COMPLETED, onInitCompleted);\n\n this.init();\n }\n\n public onError(callback: EventHandler) {\n privateVars.get(this).emitter.on(Event.ON_ERROR, (error) => {\n callback(error);\n });\n }\n\n public remove() {\n ApiService.getInstance().remove();\n\n if (privateVars.get(this).emitter) {\n privateVars.get(this).emitter.off();\n }\n }\n}\n\nexport default ATM;\n","import type { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\nimport type { IATMGetTxnTokenRequest, IGetTxnTokenResponse, ILinePayGetTxnTokenRequest } from '@91app/payment.91app.sdk.common/models/api.model';\n\nimport ApiIframe from '@91app/payment.91app.sdk/iframes/apiIFrame';\nimport ApiService from '@91app/payment.91app.sdk/service';\n\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport EventEmitter from '@91app/payment.91app.sdk.common/events/eventEmitter';\nimport Processer, { Task } from '@91app/payment.91app.sdk.common/processer';\nimport { ATMEvent, Event, LinePayEvent } from '@91app/payment.91app.sdk.common/events';\nimport { getPayTypeSettings } from '@91app/payment.91app.sdk.common/service/setting.service';\nimport { PayTypeSetting } from '@91app/payment.91app.sdk.common/service/types';\n\nconst privateVars = new WeakMap<\n LinePay,\n {\n emitter: EventEmitter;\n api: ApiIframe;\n callback?: EventHandler;\n }\n>();\n\nclass LinePay {\n constructor() {\n privateVars.set(this, {\n emitter: new EventEmitter(),\n api: null,\n callback: null,\n });\n }\n\n private init() {\n this.createProcesser();\n }\n\n public createProcesser() {\n const processer = new Processer();\n\n processer.addTask(\n new Task({\n name: 'checkConfig',\n execute: this.checkConfig.bind(this),\n options: { isBreakOnError: false },\n })\n );\n processer.addTask(\n new Task({\n name: 'checkApiService',\n execute: this.checkApiService.bind(this),\n options: { isBreakOnError: true },\n })\n );\n processer.addTask(\n new Task({\n name: 'clientVaildation',\n execute: this.clientVaildation.bind(this),\n options: { isBreakOnError: true },\n })\n );\n\n processer.onCompleted(() => {\n privateVars.get(this).emitter.emit(Event.ON_COMPLETED);\n });\n\n processer.onError((errors) => {\n Object.values(errors).forEach((item) => {\n privateVars.get(this).emitter.emit(Event.ON_ERROR, item.error);\n });\n });\n\n processer.start();\n }\n\n private clientVaildation(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().client) {\n reject(new Error('[SDK] please run SDK.setupSDK(publishableKey, serverType) first.'));\n } else {\n resolve();\n }\n });\n }\n\n private checkConfig(): Promise {\n return new Promise((resolve, reject) => {\n if (!Config.getInstance().isReady) {\n Config.getInstance().onReady(() => {\n resolve();\n });\n Config.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (Config.getInstance().error) {\n reject(Config.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n private checkApiService(): Promise {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n if (!ApiService.getInstance().isReady) {\n ApiService.getInstance().onReady(() => {\n resolve();\n });\n ApiService.getInstance().onError((error) => {\n reject(error);\n });\n } else {\n if (ApiService.getInstance().error) {\n reject(ApiService.getInstance().error);\n } else {\n resolve();\n }\n }\n });\n }\n\n public async getTxnToken(callback?: EventHandler) {\n const emitter = privateVars.get(this).emitter;\n\n const onInitCompleted = () => {\n this.callService(callback);\n emitter.off(Event.ON_COMPLETED, onInitCompleted);\n };\n\n emitter.on(Event.ON_COMPLETED, onInitCompleted);\n\n this.init();\n }\n\n private callService(callback?: EventHandler) {\n const data: ILinePayGetTxnTokenRequest = {\n publishableKey: Config.getInstance().client.publishableKey,\n sdkVer: Config.getInstance().version,\n apiOrigin: Config.getInstance().payPanelOrigin,\n };\n\n ApiService.getInstance().iframe.onGetLinePayTxnTokenCompleted(callback);\n\n ApiService.getInstance().iframe.onGetLinePayTxnTokenFailed((error) => {\n callback(error);\n privateVars.get(this).emitter.emit(Event.ON_ERROR, error);\n });\n\n ApiService.getInstance().iframe.messenger.emit(LinePayEvent.GET_TXN_TOKEN, data);\n }\n\n public onError(callback: EventHandler) {\n privateVars.get(this).emitter.on(Event.ON_ERROR, (error) => {\n callback(error);\n });\n }\n\n public remove() {\n ApiService.getInstance().remove();\n\n if (privateVars.get(this).emitter) {\n privateVars.get(this).emitter.off();\n }\n }\n}\n\nexport default LinePay;\n","import Config from '@91app/payment.91app.sdk.common/config';\nimport { CardBrand } from '@91app/payment.91app.sdk.common/enums';\nimport { ServerType } from '@91app/payment.91app.sdk.common/models';\nimport CreditCard from '@91app/payment.91app.sdk/payments/card';\nimport CreditCardCCV from '@91app/payment.91app.sdk/payments/ccv';\nimport Wallet from '@91app/payment.91app.sdk/payments/wallet';\nimport StoredValue from '@91app/payment.91app.sdk/payments/storedValue';\nimport ATM from '@91app/payment.91app.sdk/payments/atm';\nimport LinePay from '@91app/payment.91app.sdk/payments/linePay';\nimport ApiService from '@91app/payment.91app.sdk/service';\n\ninterface ISDK {\n setupSDK: (appId: string, appKey: string, serverType: ServerType, publishableKey: string) => void;\n card: CreditCard;\n ccv: CreditCardCCV;\n wallet: Wallet;\n storedValue: StoredValue;\n atm: ATM;\n linePay: LinePay;\n cardBrand: { [key in CardBrand]?: CardBrand };\n}\n\nconst privateVars = new WeakMap<\n SDK,\n {\n card: CreditCard;\n ccv: CreditCardCCV;\n wallet: Wallet;\n storedValue: StoredValue;\n atm: ATM;\n linePay: LinePay;\n }\n>();\n\nexport class SDK implements ISDK {\n constructor() {\n privateVars.set(this, {\n card: null,\n ccv: null,\n wallet: null,\n storedValue: null,\n atm: null,\n linePay: null,\n });\n }\n\n public setupSDK = (...args: string[]) => {\n // FIXME: 因 Client 有 JS Cache 問題,異動 argguments 會因為數量不同產生錯誤,先使用 ...args 方法,\n // 待 Client 端調整傳入參數後,等 cache 過期後,在修正回 setupSDK(publishableKey, serverType) 寫法\n if (args.length === 2) {\n Config.getInstance().client = {\n publishableKey: args[0],\n serverType: args[1] as ServerType,\n };\n } else if (args.length === 4) {\n Config.getInstance().client = {\n appId: args[0],\n appKey: args[1],\n serverType: args[2] as ServerType,\n publishableKey: args[3],\n };\n }\n\n Config.getInstance()\n .getVersion()\n .finally(() => {\n ApiService.getInstance().createService();\n });\n };\n\n get card(): CreditCard {\n if (!privateVars.get(this).card) {\n privateVars.get(this).card = new CreditCard();\n }\n\n if (privateVars.get(this).ccv) {\n privateVars.get(this).ccv.remove();\n privateVars.get(this).ccv = null;\n }\n\n return privateVars.get(this).card;\n }\n\n get ccv(): CreditCardCCV {\n if (!privateVars.get(this).ccv) {\n privateVars.get(this).ccv = new CreditCardCCV();\n }\n\n if (privateVars.get(this).card) {\n privateVars.get(this).card.remove();\n privateVars.get(this).card = null;\n }\n\n return privateVars.get(this).ccv;\n }\n\n get wallet(): Wallet {\n if (!privateVars.get(this).wallet) {\n privateVars.get(this).wallet = new Wallet();\n }\n\n return privateVars.get(this).wallet;\n }\n\n get storedValue(): StoredValue {\n if (!privateVars.get(this).storedValue) {\n privateVars.get(this).storedValue = new StoredValue();\n }\n\n return privateVars.get(this).storedValue;\n }\n\n get atm(): ATM {\n if (!privateVars.get(this).atm) {\n privateVars.get(this).atm = new ATM();\n }\n\n return privateVars.get(this).atm;\n }\n\n get linePay(): LinePay {\n if (!privateVars.get(this).linePay) {\n privateVars.get(this).linePay = new LinePay();\n }\n\n return privateVars.get(this).linePay;\n }\n\n get cardBrand(): { [key in CardBrand]?: CardBrand } {\n return {\n Unknown: CardBrand.Unknown,\n UnionPay: CardBrand.UnionPay,\n VISA: CardBrand.VISA,\n MasterCard: CardBrand.MasterCard,\n AMEX: CardBrand.AMEX,\n JCB: CardBrand.JCB,\n };\n }\n}\n\ndeclare global {\n interface Window {\n Payments91APP: ISDK;\n }\n}\nwindow.Payments91APP = new SDK();\n"],"names":["privateVars","WeakMap","EventEmitter","constructor","set","this","listeners","Map","on","event","callback","get","emit","payload","has","forEach","off","callbacks","index","indexOf","splice","delete","clear","Event","CreditCardEvent","WalletEvent","StoredValueEvent","ATMEvent","LinePayEvent","FieldEvent","Config","emitter","client","origin","production","gadge","payPanel","sandbox","qa","dr","devOrigin","api","fields","iframeVersion","isReady","static","_instance","getVersion","response","clientData","__awaiter","requestUrl","getInstance","gadgeOrigin","fetch","method","headers","body","JSON","stringify","then","res","json","Promise","resolve","parse","settings","error","reject","statusCode","message","_a","apiVersion","fieldsVersion","version","remove","onReady","onError","process","env","VERSION","clientOrigin","window","location","parent","document","referrer","href","length","serverType","toLowerCase","payPanelOrigin","apiIFrameOrigin","NODE_ENV","fieldsIFrameOrigin","CardBrand","FieldStatus","DEFAULT_TASK_OPTIONS","isBreakOnError","Task","config","name","execute","options","run","Processer","tasks","taskIndex","errors","addTask","task","push","executeTask","next","toString","break","_b","_d","_c","_e","errorCallback","call","completeCallback","start","onCompleted","MessageEmitter","current","target","key","addEventListener","evt","type","data","split","prefixEvent","toUpperCase","postMessage","BaseIFrame","element","messenger","contentWindow","setAttribute","init","onLoaded","FieldIFrame","super","onUpdate","bind","onUpdateCardBrand","onFocus","onBlur","isSetupCreditCardStyleTypeValid","includes","isSetupCreditCardCSSStyleValid","cssStyle","combineDefaultSetup","defaultConfig","enableIcon","number","placeholder","expirationDate","ccv","styles","normal","width","height","color","borderColor","focus","success","cloneConfig","Object","assign","keys","filter","styleType","IFRAME_LOAD_FAIL_TIME","timeout","delay","timer","setTimeout","clearTimeout","ApiIframe","style","display","onGetTxnTokenCompleted","onGetTxnTokenFailed","onGetTxnLastTokenCompleted","onGetTxnLastTokenFailed","onGetWalletTxnTokenCompleted","onGetWalletTxnTokenFailed","onGetStoredValueTxnTokenCompleted","onGetStoredValueTxnTokenFailed","onGetATMTxnTokenCompleted","onGetATMTxnTokenFailed","onGetLinePayTxnTokenCompleted","onGetLinePayTxnTokenFailed","IFRAME_ID","ApiService","iframe","createService","createIframe","race","createIframeElement","getElementById","createElement","src","id","appendChild","DEFAULT_CREDIT_CARD","canGetToken","cardBrand","Unknown","status","Normal","value","errorMessage","CreditCard","card","setup","createProcesser","processer","checkConfig","checkApiService","clientVaildation","fieldsVaildation","styleVaildation","createNumberField","createExpirationDateField","createCCVField","values","item","Error","undefined","find","field","HTMLElement","entries","params","encodeURIComponent","querySelector","innerHTML","result","updateCreditCard","focusToNextField","isFieldCompleted","Success","Changing","fieldKeys","currentIndex","findIndex","nextType","nextField","getTxnToken","publishableKey","sdkVer","cardNumber","cardExpiryDate","cardSecurityCode","apiOrigin","update","reset","CreditCardCCV","createField","setCardBrand","brand","allowedCardBrand","AMEX","JCB","MasterCard","UnionPay","VISA","getTxnLastToken","Wallet","callService","StoredValue","ATM","onInitCompleted","getSupportedBanks","payType","catch","finally","LinePay","SDK","setupSDK","args","appId","appKey","wallet","storedValue","atm","linePay","Payments91APP"],"mappings":"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"}