{"version":3,"file":"index.js","sources":["../../common/src/events/eventEmitter.ts","../../common/src/events/index.ts","../../common/src/config.ts","../../common/src/service/version.service.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/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","export enum 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}\n\nexport enum ServiceEvent {\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 SYNC_CLIENT = 'SYNC_CLIENT',\n}\n\nexport enum 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}\n","import type { EventHandler } from '@91app/payment.91app.sdk.common/models/events.model';\n\nimport EventEmitter from './events/eventEmitter';\nimport { ClientData, ServerType } from './models';\nimport { getVersionConfig } from './service/version.service';\nimport { Event } from './events';\n\nconst privateVars = new WeakMap<\n Config,\n {\n emitter: EventEmitter;\n client: ClientData;\n origin: { [type in ServerType]: { 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 },\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].gadge;\n }\n\n public get payPanelOrigin(): string {\n return privateVars.get(this).origin[privateVars.get(this).client.serverType].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","import { ClientData } from '../models';\n\nimport Config from '@91app/payment.91app.sdk.common/config';\nimport { ApiResponseEntity } from '../models/api.model';\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 ?? '網路異常,無法取得 Version Config',\n } as ApiResponseEntity);\n }\n};\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 this.target.postMessage(message, this.origin);\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, ServiceEvent } 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(ServiceEvent.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 { ServiceEvent } 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(ServiceEvent.GET_TXN_TOKEN_COMPLETED, (response) => {\n callback(response);\n });\n }\n\n public onGetTxnTokenFailed(callback: EventHandler) {\n return this.messenger.on(ServiceEvent.GET_TXN_TOKEN_FAILED, (response) => {\n callback(response);\n });\n }\n\n public onGetTxnLastTokenCompleted(callback: EventHandler) {\n this.messenger.on(ServiceEvent.GET_TXN_LAST_TOKEN_COMPLETED, (response) => {\n callback(response);\n });\n }\n\n public onGetTxnLastTokenFailed(callback: EventHandler) {\n this.messenger.on(ServiceEvent.GET_TXN_LAST_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, ServiceEvent } 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 { getCardCCVMaxLength } from '@91app/payment.91app.sdk.fields/utilities/index';\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(appId, appKey, serverType, publishableKey) 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 };\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(ServiceEvent.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, ServiceEvent } 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(appId, appKey, serverType, publishableKey) 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 };\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(ServiceEvent.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, IGetTxnTokenRequest } 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, ServiceEvent } from '@91app/payment.91app.sdk.common/events';\n\ninterface IWalletRequest extends Omit {\n sourceType: 'Wallet';\n}\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(appId, appKey, serverType, publishableKey) 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: IWalletRequest = {\n publishableKey: Config.getInstance().client.publishableKey,\n sdkVer: Config.getInstance().version,\n sourceType: 'Wallet',\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(ServiceEvent.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 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 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 cardBrand: { [key in CardBrand]?: CardBrand };\n}\n\nconst privateVars = new WeakMap<\n SDK,\n {\n card: CreditCard;\n ccv: CreditCardCCV;\n wallet: Wallet;\n }\n>();\n\nexport class SDK implements ISDK {\n constructor() {\n privateVars.set(this, {\n card: null,\n ccv: null,\n wallet: 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 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","ServiceEvent","FieldEvent","Config","emitter","client","origin","production","gadge","payPanel","sandbox","qa","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","ON_ERROR","ON_COMPLETED","remove","onReady","onError","process","env","VERSION","clientOrigin","window","location","parent","document","referrer","href","length","serverType","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","toLowerCase","prefixEvent","toUpperCase","postMessage","BaseIFrame","element","messenger","contentWindow","setAttribute","init","SYNC_CLIENT","ON_REMOVE","onLoaded","FieldIFrame","super","onUpdate","bind","onUpdateCardBrand","UPDATE_FIELD","UPDATE_CARD_BRAND","onFocus","ON_FOCUS","onBlur","ON_BLUR","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","GET_TXN_TOKEN_COMPLETED","onGetTxnTokenFailed","GET_TXN_TOKEN_FAILED","onGetTxnLastTokenCompleted","GET_TXN_LAST_TOKEN_COMPLETED","onGetTxnLastTokenFailed","GET_TXN_LAST_TOKEN_FAILED","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","SYNC_CARD_BRAND","SET_ICON","RESET_ICON","focusToNextField","ON_UPDATE","isFieldCompleted","Success","Changing","fieldKeys","currentIndex","findIndex","nextType","nextField","FOCUS","getTxnToken","publishableKey","sdkVer","cardNumber","cardExpiryDate","cardSecurityCode","GET_TXN_TOKEN","update","reset","CreditCardCCV","createField","setCardBrand","brand","allowedCardBrand","AMEX","JCB","MasterCard","UnionPay","VISA","getTxnLastToken","GET_TXN_LAST_TOKEN","Wallet","callService","sourceType","SDK","setupSDK","args","appId","appKey","finally","wallet","Payments91APP"],"mappings":"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"}