sales-frontend-bridge 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1 +1,3 @@
1
- Hi
1
+ # bridge
2
+
3
+ - Web-App, Web-IframeWeb 간 브릿지 함수 제공
package/dist/index.cjs CHANGED
@@ -2,12 +2,12 @@
2
2
 
3
3
  var __defProp = Object.defineProperty;
4
4
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
5
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
+ var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
6
6
 
7
7
  // src/bridge/utils/platform-detector-utils.ts
8
8
  var platformDetectorUtils = {
9
9
  getPlatform() {
10
- if (window.n2bridge) {
10
+ if (window.n2Bridge) {
11
11
  return "android";
12
12
  }
13
13
  if (window.webkit) {
@@ -134,12 +134,26 @@ var Core = class {
134
134
  * @param option
135
135
  * @returns
136
136
  */
137
- async callToNative(action, options) {
137
+ async callToNative(action, options, timeout = 2e3) {
138
138
  const { retainCallback: retain, ...commandOptions } = options || {};
139
139
  return new Promise((resolve, reject) => {
140
140
  const promiseId = `${action}_${this.generatePromiseId()}`;
141
141
  console.log("[callToNative] promiseId::", promiseId);
142
- window.n2bridge.promises[promiseId] = { resolve, reject, retain };
142
+ const timeoutId = setTimeout(() => {
143
+ this.cleanupPromise(promiseId);
144
+ reject(new Error(`Bridge call timeout: ${action}`));
145
+ }, timeout);
146
+ window.n2bridge.promises[promiseId] = {
147
+ resolve: (value) => {
148
+ clearTimeout(timeoutId);
149
+ resolve(value);
150
+ },
151
+ reject: (reason) => {
152
+ clearTimeout(timeoutId);
153
+ reject(reason);
154
+ },
155
+ retain
156
+ };
143
157
  try {
144
158
  const command = {
145
159
  action,
@@ -150,11 +164,11 @@ var Core = class {
150
164
  console.log("[callToNative] command::", command);
151
165
  const platform = platformDetectorUtils.getPlatform();
152
166
  if (platform === "android") {
153
- window.n2bridge?.callFromWeb?.(JSON.stringify(command));
167
+ window.n2Bridge?.callFromWeb?.(JSON.stringify(command));
154
168
  return;
155
169
  }
156
170
  if (platform === "ios") {
157
- window.webkit?.messageHandlers?.n2bridge?.postMessage(JSON.stringify(command));
171
+ window.webkit?.messageHandlers?.n2Bridge?.postMessage(JSON.stringify(command));
158
172
  return;
159
173
  }
160
174
  if (platform === "portal") {
@@ -183,16 +197,9 @@ var Core = class {
183
197
  // src/bridge/common-bridge.ts
184
198
  var CommonBridge = class {
185
199
  constructor() {
186
- __publicField(this, "platform");
187
200
  __publicField(this, "core");
188
- this.platform = platformDetectorUtils.getPlatform();
189
201
  this.core = new Core();
190
202
  }
191
- // 공통 기능 구현
192
- //! 분기가 생기면 각 클래스에서 Override
193
- async logout(options) {
194
- return this.core.callToNative("logout", options);
195
- }
196
203
  };
197
204
 
198
205
  // src/bridge/native-bridge.ts
@@ -205,6 +212,15 @@ var NativeBridge = class extends CommonBridge {
205
212
  async showWebPopup(options) {
206
213
  return this.core.callToNative("showWebPopup", options);
207
214
  }
215
+ /**
216
+ *
217
+ * @param options
218
+ * @returns
219
+ */
220
+ async jumpSafari(options) {
221
+ return this.core.callToNative("jumpSafari", options);
222
+ }
223
+ // TODO: 필요 플러그인들 추가
208
224
  };
209
225
 
210
226
  // src/bridge/portal-bridge.ts
@@ -215,57 +231,17 @@ var PortalBridge = class extends CommonBridge {
215
231
  * @returns
216
232
  */
217
233
  async openUrlWindow(options) {
218
- return this.core.callToNative("openMdi", options);
219
- }
220
- };
221
-
222
- // src/bridge/factory/bridge-factory.ts
223
- var BridgeFactory = class {
224
- static create() {
225
- const platform = platformDetectorUtils.getPlatform();
226
- switch (platform) {
227
- case "android":
228
- case "ios":
229
- return new NativeBridge();
230
- case "portal":
231
- return new PortalBridge();
232
- case "web":
233
- default:
234
- console.warn(`[BridgeFactory] \uD604\uC7AC \uD50C\uB7AB\uD3FC(${platform})\uC5D0\uC11C\uB294 Bridge \uAC1D\uCCB4\uB97C \uC0DD\uC131\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.`);
235
- return new CommonBridge();
236
- }
234
+ return this.core.callToNative("openUrlWindow", options);
237
235
  }
236
+ // TODO: 필요 플러그인들 추가
238
237
  };
239
238
 
240
239
  // src/bridge/bridge.ts
241
- var Bridge = class {
242
- static getInstance() {
243
- if (!this.instance) {
244
- this.instance = BridgeFactory.create();
245
- }
246
- return this.instance;
247
- }
248
- // 플랫폼별 접근자들만 제공
249
- static getCommonBridge() {
250
- return this.getInstance();
251
- }
252
- static getNativeBridge() {
253
- const instance = this.getInstance();
254
- return instance instanceof NativeBridge ? instance : null;
255
- }
256
- static getPortalBridge() {
257
- const instance = this.getInstance();
258
- return instance instanceof PortalBridge ? instance : null;
259
- }
260
- // 플랫폼 체크
261
- static isNativePlatform() {
262
- return this.getInstance() instanceof NativeBridge;
263
- }
264
- static isPortalPlatform() {
265
- return this.getInstance() instanceof PortalBridge;
266
- }
240
+ var Bridge = {
241
+ native: new NativeBridge(),
242
+ portal: new PortalBridge(),
243
+ core: new Core()
267
244
  };
268
- __publicField(Bridge, "instance");
269
245
 
270
246
  exports.Bridge = Bridge;
271
247
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bridge/utils/platform-detector-utils.ts","../src/bridge/core/core.ts","../src/bridge/common-bridge.ts","../src/bridge/native-bridge.ts","../src/bridge/portal-bridge.ts","../src/bridge/factory/bridge-factory.ts","../src/bridge/bridge.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import { Platform } from '../types/common.types';\n\nexport const platformDetectorUtils = {\n getPlatform(): Platform {\n // TODO: platform 탐지는 좀 더 세밀하게 할 수 있도록 네이티브에 요청\n if (window.n2bridge) {\n return 'android';\n }\n\n if (window.webkit) {\n return 'ios';\n }\n\n if (window.self !== window.top) {\n return 'portal';\n }\n\n return 'web';\n }\n};\n","import { platformDetectorUtils } from '../utils/platform-detector-utils';\nimport { BridgeCommand, BridgeOptions, BridgePromise } from '../types/core.types';\nimport { BridgeAction } from '../types/bridge-types';\n\n/**\n * Bridge 통신 위한 핵심 클래스\n */\nexport class Core {\n constructor() {\n this.initializeWindowBridge();\n }\n\n /**\n * Promise를 처리하기 위한 고유 ID 생성\n * @returns\n */\n private generatePromiseId(): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).slice(2, 11);\n\n return `${timestamp}_${random}`;\n }\n\n /**\n * 네이티브 통신을 위해 window.n2bridge 객체 초기화\n */\n private initializeWindowBridge(): void {\n // 예외 체크\n if (!window.n2bridge) {\n window.n2bridge = {\n promises: {},\n resolvePromise: () => {},\n finallyResolvePromise: () => {},\n callFromNative: () => {}\n };\n }\n\n // 항상 최신 함수로 업데이트\n window.n2bridge.resolvePromise = this.createResolvePromiseHandler();\n window.n2bridge.finallyResolvePromise = this.createFinallyResolvePromiseHandler();\n window.n2bridge.callFromNative = this.createCallFromNativeHandler();\n }\n\n /**\n * Promise 처리 함수(Native에서 호출)\n * @returns\n */\n private createResolvePromiseHandler() {\n return (promiseId: string, data?: any, error?: any) => {\n console.log('[resolvePromise]::', promiseId, data, error);\n\n const promise: BridgePromise | undefined = window.n2bridge.promises[promiseId];\n if (!promise) {\n console.error('[resolvePromise] Promise not found::', promiseId);\n return;\n }\n\n try {\n if (error) {\n promise.reject(error);\n this.cleanupPromise(promiseId);\n return;\n }\n\n if (promise.retain) {\n promise.retain(data);\n return;\n }\n\n promise.resolve(data);\n this.cleanupPromise(promiseId);\n } catch (err) {\n console.error('[resolvePromise] Error handling promise::', err);\n this.cleanupPromise(promiseId);\n }\n };\n }\n\n /**\n * Promise 최종 처리 함수\n * @returns\n */\n private createFinallyResolvePromiseHandler() {\n return (promiseId: string, data?: any, error?: any) => {\n const promise: BridgePromise | undefined = window.n2bridge.promises[promiseId];\n if (!promise) {\n console.error('[resolvePromise] Promise not found::', promiseId);\n return;\n }\n\n try {\n if (error) {\n promise.reject(error);\n this.cleanupPromise(promiseId);\n return;\n }\n\n if (promise.retain) {\n promise.retain(data);\n return;\n }\n\n promise.resolve(data);\n this.cleanupPromise(promiseId);\n } catch (err) {\n console.error('[resolvePromise] Error handling promise::', err);\n this.cleanupPromise(promiseId);\n }\n };\n }\n\n /**\n * Native 에서 웹으로 호출하는 함수\n * TODO: 필요시 추가 코딩\n * @returns\n */\n private createCallFromNativeHandler() {\n return (jsonStr: string) => {\n try {\n const command = JSON.parse(jsonStr);\n console.log('[callFromNative]::', command);\n } catch (error) {\n console.error('[callFromNative] parse error::', error);\n }\n };\n }\n\n /**\n * 부모 통신\n * @param service\n * @param action\n * @param option\n * @returns\n */\n async callToNative<T = any>(action: BridgeAction, options?: BridgeOptions): Promise<T> {\n const { retainCallback: retain, ...commandOptions } = options || {};\n\n return new Promise<T>((resolve, reject) => {\n const promiseId = `${action}_${this.generatePromiseId()}`;\n console.log('[callToNative] promiseId::', promiseId);\n\n // 바로 window.n2bridge.promises에 저장\n window.n2bridge.promises[promiseId] = { resolve, reject, retain };\n\n try {\n const command: BridgeCommand = {\n action,\n eventName: action,\n promiseId,\n option: commandOptions\n };\n\n console.log('[callToNative] command::', command);\n\n const platform = platformDetectorUtils.getPlatform();\n\n if (platform === 'android') {\n window.n2bridge?.callFromWeb?.(JSON.stringify(command));\n\n return;\n }\n\n if (platform === 'ios') {\n window.webkit?.messageHandlers?.n2bridge?.postMessage(JSON.stringify(command));\n\n return;\n }\n\n if (platform === 'portal') {\n window.parent.postMessage(command, '*');\n\n return;\n }\n\n // 지원하지 않는 플랫폼\n console.warn(`[callToNative] 현재 플랫폼(${platform})에서는 지원하지 않는 서비스(${action})입니다.`);\n this.cleanupPromise(promiseId);\n reject(new Error(`Unsupported platform: ${platform}`));\n } catch (error) {\n console.error('[callToNative] error::', error);\n this.cleanupPromise(promiseId);\n reject(error);\n }\n });\n }\n\n /**\n * promiseId를 초기화 해줍니다.\n * @param promiseId\n */\n private cleanupPromise(promiseId: string): void {\n delete window.n2bridge.promises[promiseId];\n }\n}\n","import { ICommonBridge } from './types/common.types';\nimport { Core } from './core/core';\nimport { Platform } from './types/common.types';\nimport { platformDetectorUtils } from './utils/platform-detector-utils';\nimport { LoginOptions } from './types/bridge-types';\n\n/**\n * App, 영업포털과 동일하게 사용가능한 기능 정의 클래스\n */\nexport class CommonBridge implements ICommonBridge {\n protected platform: Platform;\n protected core: Core;\n\n constructor() {\n this.platform = platformDetectorUtils.getPlatform();\n this.core = new Core();\n }\n\n // 공통 기능 구현\n //! 분기가 생기면 각 클래스에서 Override\n async logout(options: LoginOptions): Promise<void> {\n return this.core.callToNative('logout', options);\n }\n}\n","import { INativeBridge } from './types/common.types';\nimport { CommonBridge } from './common-bridge';\nimport { ShowWebPopupOptions } from './types/bridge-types';\n\nexport class NativeBridge extends CommonBridge implements INativeBridge {\n /**\n *\n * @param options\n * @returns\n */\n async showWebPopup<T = any>(options: ShowWebPopupOptions): Promise<T> {\n return this.core.callToNative<T>('showWebPopup', options);\n }\n}\n","import { CommonBridge } from './common-bridge';\nimport { IPortalBridge } from './types/common.types';\n\n/**\n * 영업포탈 전용 Bridge\n */\nexport class PortalBridge extends CommonBridge implements IPortalBridge {\n /**\n * 영업포탈 tab open\n * @param options\n * @returns\n */\n async openUrlWindow<T = any>(options: any): Promise<T> {\n return this.core.callToNative<T>('openMdi', options);\n }\n}\n","import { platformDetectorUtils } from '../utils/platform-detector-utils';\nimport { NativeBridge } from '../native-bridge';\nimport { PortalBridge } from '../portal-bridge';\nimport { CommonBridge } from '../common-bridge';\n\n/**\n * 브릿지 객체 생성 전용 클래스\n */\nexport class BridgeFactory {\n static create(): NativeBridge | PortalBridge | CommonBridge {\n const platform = platformDetectorUtils.getPlatform();\n\n switch (platform) {\n case 'android':\n case 'ios':\n return new NativeBridge();\n\n case 'portal':\n return new PortalBridge();\n\n case 'web':\n default:\n console.warn(`[BridgeFactory] 현재 플랫폼(${platform})에서는 Bridge 객체를 생성할 수 없습니다.`);\n\n return new CommonBridge();\n }\n }\n}\n","import { NativeBridge } from './native-bridge';\nimport { PortalBridge } from './portal-bridge';\nimport { CommonBridge } from './common-bridge';\nimport { BridgeFactory } from './factory/bridge-factory';\n\nexport class Bridge {\n private static instance: NativeBridge | PortalBridge | CommonBridge;\n\n static getInstance() {\n if (!this.instance) {\n this.instance = BridgeFactory.create();\n }\n return this.instance;\n }\n\n // 플랫폼별 접근자들만 제공\n static getCommonBridge(): CommonBridge {\n return this.getInstance();\n }\n\n static getNativeBridge(): NativeBridge | null {\n const instance = this.getInstance();\n return instance instanceof NativeBridge ? instance : null;\n }\n\n static getPortalBridge(): PortalBridge | null {\n const instance = this.getInstance();\n return instance instanceof PortalBridge ? instance : null;\n }\n\n // 플랫폼 체크\n static isNativePlatform(): boolean {\n return this.getInstance() instanceof NativeBridge;\n }\n\n static isPortalPlatform(): boolean {\n return this.getInstance() instanceof PortalBridge;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/bridge/utils/platform-detector-utils.ts","../src/bridge/core/core.ts","../src/bridge/common-bridge.ts","../src/bridge/native-bridge.ts","../src/bridge/portal-bridge.ts","../src/bridge/bridge.ts"],"names":[],"mappings":";;;;;;;AAEO,IAAM,qBAAwB,GAAA;AAAA,EACnC,WAAwB,GAAA;AAEtB,IAAA,IAAI,OAAO,QAAU,EAAA;AACnB,MAAO,OAAA,SAAA;AAAA;AAGT,IAAA,IAAI,OAAO,MAAQ,EAAA;AACjB,MAAO,OAAA,KAAA;AAAA;AAGT,IAAI,IAAA,MAAA,CAAO,IAAS,KAAA,MAAA,CAAO,GAAK,EAAA;AAC9B,MAAO,OAAA,QAAA;AAAA;AAGT,IAAO,OAAA,KAAA;AAAA;AAEX,CAAA;;;ACZO,IAAM,OAAN,MAAW;AAAA,EAChB,WAAc,GAAA;AACZ,IAAA,IAAA,CAAK,sBAAuB,EAAA;AAAA;AAC9B;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAA4B,GAAA;AAClC,IAAM,MAAA,SAAA,GAAY,KAAK,GAAI,EAAA;AAC3B,IAAM,MAAA,MAAA,GAAS,KAAK,MAAO,EAAA,CAAE,SAAS,EAAE,CAAA,CAAE,KAAM,CAAA,CAAA,EAAG,EAAE,CAAA;AAErD,IAAO,OAAA,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA;AAC/B;AAAA;AAAA;AAAA,EAKQ,sBAA+B,GAAA;AAErC,IAAI,IAAA,CAAC,OAAO,QAAU,EAAA;AACpB,MAAA,MAAA,CAAO,QAAW,GAAA;AAAA,QAChB,UAAU,EAAC;AAAA,QACX,gBAAgB,MAAM;AAAA,SAAC;AAAA,QACvB,uBAAuB,MAAM;AAAA,SAAC;AAAA,QAC9B,gBAAgB,MAAM;AAAA;AAAC,OACzB;AAAA;AAIF,IAAO,MAAA,CAAA,QAAA,CAAS,cAAiB,GAAA,IAAA,CAAK,2BAA4B,EAAA;AAClE,IAAO,MAAA,CAAA,QAAA,CAAS,qBAAwB,GAAA,IAAA,CAAK,kCAAmC,EAAA;AAChF,IAAO,MAAA,CAAA,QAAA,CAAS,cAAiB,GAAA,IAAA,CAAK,2BAA4B,EAAA;AAAA;AACpE;AAAA;AAAA;AAAA;AAAA,EAMQ,2BAA8B,GAAA;AACpC,IAAO,OAAA,CAAC,SAAmB,EAAA,IAAA,EAAY,KAAgB,KAAA;AACrD,MAAA,OAAA,CAAQ,GAAI,CAAA,oBAAA,EAAsB,SAAW,EAAA,IAAA,EAAM,KAAK,CAAA;AAExD,MAAA,MAAM,OAAqC,GAAA,MAAA,CAAO,QAAS,CAAA,QAAA,CAAS,SAAS,CAAA;AAC7E,MAAA,IAAI,CAAC,OAAS,EAAA;AACZ,QAAQ,OAAA,CAAA,KAAA,CAAM,wCAAwC,SAAS,CAAA;AAC/D,QAAA;AAAA;AAGF,MAAI,IAAA;AACF,QAAA,IAAI,KAAO,EAAA;AACT,UAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AACpB,UAAA,IAAA,CAAK,eAAe,SAAS,CAAA;AAC7B,UAAA;AAAA;AAGF,QAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,UAAA,OAAA,CAAQ,OAAO,IAAI,CAAA;AACnB,UAAA;AAAA;AAGF,QAAA,OAAA,CAAQ,QAAQ,IAAI,CAAA;AACpB,QAAA,IAAA,CAAK,eAAe,SAAS,CAAA;AAAA,eACtB,GAAK,EAAA;AACZ,QAAQ,OAAA,CAAA,KAAA,CAAM,6CAA6C,GAAG,CAAA;AAC9D,QAAA,IAAA,CAAK,eAAe,SAAS,CAAA;AAAA;AAC/B,KACF;AAAA;AACF;AAAA;AAAA;AAAA;AAAA,EAMQ,kCAAqC,GAAA;AAC3C,IAAO,OAAA,CAAC,SAAmB,EAAA,IAAA,EAAY,KAAgB,KAAA;AACrD,MAAA,MAAM,OAAqC,GAAA,MAAA,CAAO,QAAS,CAAA,QAAA,CAAS,SAAS,CAAA;AAC7E,MAAA,IAAI,CAAC,OAAS,EAAA;AACZ,QAAQ,OAAA,CAAA,KAAA,CAAM,wCAAwC,SAAS,CAAA;AAC/D,QAAA;AAAA;AAGF,MAAI,IAAA;AACF,QAAA,IAAI,KAAO,EAAA;AACT,UAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AACpB,UAAA,IAAA,CAAK,eAAe,SAAS,CAAA;AAC7B,UAAA;AAAA;AAGF,QAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,UAAA,OAAA,CAAQ,OAAO,IAAI,CAAA;AACnB,UAAA;AAAA;AAGF,QAAA,OAAA,CAAQ,QAAQ,IAAI,CAAA;AACpB,QAAA,IAAA,CAAK,eAAe,SAAS,CAAA;AAAA,eACtB,GAAK,EAAA;AACZ,QAAQ,OAAA,CAAA,KAAA,CAAM,6CAA6C,GAAG,CAAA;AAC9D,QAAA,IAAA,CAAK,eAAe,SAAS,CAAA;AAAA;AAC/B,KACF;AAAA;AACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,2BAA8B,GAAA;AACpC,IAAA,OAAO,CAAC,OAAoB,KAAA;AAC1B,MAAI,IAAA;AACF,QAAM,MAAA,OAAA,GAAU,IAAK,CAAA,KAAA,CAAM,OAAO,CAAA;AAClC,QAAQ,OAAA,CAAA,GAAA,CAAI,sBAAsB,OAAO,CAAA;AAAA,eAClC,KAAO,EAAA;AACd,QAAQ,OAAA,CAAA,KAAA,CAAM,kCAAkC,KAAK,CAAA;AAAA;AACvD,KACF;AAAA;AACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAA,CAAsB,MAAsB,EAAA,OAAA,EAAyB,UAAkB,GAAkB,EAAA;AAC7G,IAAA,MAAM,EAAE,cAAgB,EAAA,MAAA,EAAQ,GAAG,cAAe,EAAA,GAAI,WAAW,EAAC;AAElE,IAAA,OAAO,IAAI,OAAA,CAAW,CAAC,OAAA,EAAS,MAAW,KAAA;AACzC,MAAA,MAAM,YAAY,CAAG,EAAA,MAAM,CAAI,CAAA,EAAA,IAAA,CAAK,mBAAmB,CAAA,CAAA;AACvD,MAAQ,OAAA,CAAA,GAAA,CAAI,8BAA8B,SAAS,CAAA;AAGnD,MAAM,MAAA,SAAA,GAAY,WAAW,MAAM;AACjC,QAAA,IAAA,CAAK,eAAe,SAAS,CAAA;AAC7B,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAwB,qBAAA,EAAA,MAAM,EAAE,CAAC,CAAA;AAAA,SACjD,OAAO,CAAA;AAGV,MAAO,MAAA,CAAA,QAAA,CAAS,QAAS,CAAA,SAAS,CAAI,GAAA;AAAA,QACpC,OAAA,EAAS,CAAC,KAAa,KAAA;AACrB,UAAA,YAAA,CAAa,SAAS,CAAA;AACtB,UAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,SACf;AAAA,QACA,MAAA,EAAQ,CAAC,MAAiB,KAAA;AACxB,UAAA,YAAA,CAAa,SAAS,CAAA;AACtB,UAAA,MAAA,CAAO,MAAM,CAAA;AAAA,SACf;AAAA,QACA;AAAA,OACF;AAEA,MAAI,IAAA;AACF,QAAA,MAAM,OAAyB,GAAA;AAAA,UAC7B,MAAA;AAAA,UACA,SAAW,EAAA,MAAA;AAAA,UACX,SAAA;AAAA,UACA,MAAQ,EAAA;AAAA,SACV;AAEA,QAAQ,OAAA,CAAA,GAAA,CAAI,4BAA4B,OAAO,CAAA;AAE/C,QAAM,MAAA,QAAA,GAAW,sBAAsB,WAAY,EAAA;AAEnD,QAAA,IAAI,aAAa,SAAW,EAAA;AAC1B,UAAA,MAAA,CAAO,QAAU,EAAA,WAAA,GAAc,IAAK,CAAA,SAAA,CAAU,OAAO,CAAC,CAAA;AAEtD,UAAA;AAAA;AAGF,QAAA,IAAI,aAAa,KAAO,EAAA;AACtB,UAAA,MAAA,CAAO,QAAQ,eAAiB,EAAA,QAAA,EAAU,YAAY,IAAK,CAAA,SAAA,CAAU,OAAO,CAAC,CAAA;AAE7E,UAAA;AAAA;AAGF,QAAA,IAAI,aAAa,QAAU,EAAA;AACzB,UAAO,MAAA,CAAA,MAAA,CAAO,WAAY,CAAA,OAAA,EAAS,GAAG,CAAA;AAEtC,UAAA;AAAA;AAIF,QAAA,OAAA,CAAQ,IAAK,CAAA,CAAA,+CAAA,EAAyB,QAAQ,CAAA,6EAAA,EAAoB,MAAM,CAAO,oBAAA,CAAA,CAAA;AAC/E,QAAA,IAAA,CAAK,eAAe,SAAS,CAAA;AAC7B,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAyB,sBAAA,EAAA,QAAQ,EAAE,CAAC,CAAA;AAAA,eAC9C,KAAO,EAAA;AACd,QAAQ,OAAA,CAAA,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,QAAA,IAAA,CAAK,eAAe,SAAS,CAAA;AAC7B,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA;AACd,KACD,CAAA;AAAA;AACH;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAe,SAAyB,EAAA;AAC9C,IAAO,OAAA,MAAA,CAAO,QAAS,CAAA,QAAA,CAAS,SAAS,CAAA;AAAA;AAE7C,CAAA;;;AC5MO,IAAM,eAAN,MAAmB;AAAA,EAGxB,WAAc,GAAA;AAFd,IAAU,aAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AAGR,IAAK,IAAA,CAAA,IAAA,GAAO,IAAI,IAAK,EAAA;AAAA;AAEzB,CAAA;;;ACJO,IAAM,YAAA,GAAN,cAA2B,YAAsC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMtE,MAAM,aAAsB,OAA0C,EAAA;AACpE,IAAA,OAAO,IAAK,CAAA,IAAA,CAAK,YAAgB,CAAA,cAAA,EAAgB,OAAO,CAAA;AAAA;AAC1D;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAoB,OAA0C,EAAA;AAClE,IAAA,OAAO,IAAK,CAAA,IAAA,CAAK,YAAgB,CAAA,YAAA,EAAc,OAAO,CAAA;AAAA;AACxD;AAGF,CAAA;;;ACrBO,IAAM,YAAA,GAAN,cAA2B,YAAsC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMtE,MAAM,cAAuB,OAA0B,EAAA;AACrD,IAAA,OAAO,IAAK,CAAA,IAAA,CAAK,YAAgB,CAAA,eAAA,EAAiB,OAAO,CAAA;AAAA;AAC3D;AAGF,CAAA;;;ACbO,IAAM,MAAS,GAAA;AAAA,EACpB,MAAA,EAAQ,IAAI,YAAa,EAAA;AAAA,EACzB,MAAA,EAAQ,IAAI,YAAa,EAAA;AAAA,EACzB,IAAA,EAAM,IAAI,IAAK;AACjB","file":"index.cjs","sourcesContent":["import { Platform } from '../types/common.types';\n\nexport const platformDetectorUtils = {\n getPlatform(): Platform {\n // TODO: platform 탐지는 좀 더 세밀하게 할 수 있도록 네이티브에 요청\n if (window.n2Bridge) {\n return 'android';\n }\n\n if (window.webkit) {\n return 'ios';\n }\n\n if (window.self !== window.top) {\n return 'portal';\n }\n\n return 'web';\n }\n};\n","import { platformDetectorUtils } from '../utils/platform-detector-utils';\nimport { BridgeCommand, BridgeOptions, BridgePromise } from './core.types';\nimport { BridgeAction } from '../types/common.types';\n\n/**\n * Bridge 통신 위한 핵심 클래스\n */\nexport class Core {\n constructor() {\n this.initializeWindowBridge();\n }\n\n /**\n * Promise를 처리하기 위한 고유 ID 생성\n * @returns\n */\n private generatePromiseId(): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).slice(2, 11);\n\n return `${timestamp}_${random}`;\n }\n\n /**\n * 네이티브 통신을 위해 window.n2bridge 객체 초기화\n */\n private initializeWindowBridge(): void {\n // 예외 체크\n if (!window.n2bridge) {\n window.n2bridge = {\n promises: {},\n resolvePromise: () => {},\n finallyResolvePromise: () => {},\n callFromNative: () => {}\n };\n }\n\n // 항상 최신 함수로 업데이트\n window.n2bridge.resolvePromise = this.createResolvePromiseHandler();\n window.n2bridge.finallyResolvePromise = this.createFinallyResolvePromiseHandler();\n window.n2bridge.callFromNative = this.createCallFromNativeHandler();\n }\n\n /**\n * Promise 처리 함수(Native에서 호출)\n * @returns\n */\n private createResolvePromiseHandler() {\n return (promiseId: string, data?: any, error?: any) => {\n console.log('[resolvePromise]::', promiseId, data, error);\n\n const promise: BridgePromise | undefined = window.n2bridge.promises[promiseId];\n if (!promise) {\n console.error('[resolvePromise] Promise not found::', promiseId);\n return;\n }\n\n try {\n if (error) {\n promise.reject(error);\n this.cleanupPromise(promiseId);\n return;\n }\n\n if (promise.retain) {\n promise.retain(data);\n return;\n }\n\n promise.resolve(data);\n this.cleanupPromise(promiseId);\n } catch (err) {\n console.error('[resolvePromise] Error handling promise::', err);\n this.cleanupPromise(promiseId);\n }\n };\n }\n\n /**\n * Promise 최종 처리 함수\n * @returns\n */\n private createFinallyResolvePromiseHandler() {\n return (promiseId: string, data?: any, error?: any) => {\n const promise: BridgePromise | undefined = window.n2bridge.promises[promiseId];\n if (!promise) {\n console.error('[resolvePromise] Promise not found::', promiseId);\n return;\n }\n\n try {\n if (error) {\n promise.reject(error);\n this.cleanupPromise(promiseId);\n return;\n }\n\n if (promise.retain) {\n promise.retain(data);\n return;\n }\n\n promise.resolve(data);\n this.cleanupPromise(promiseId);\n } catch (err) {\n console.error('[resolvePromise] Error handling promise::', err);\n this.cleanupPromise(promiseId);\n }\n };\n }\n\n /**\n * Native 에서 웹으로 호출하는 함수\n * TODO: 필요시 추가 코딩\n * @returns\n */\n private createCallFromNativeHandler() {\n return (jsonStr: string) => {\n try {\n const command = JSON.parse(jsonStr);\n console.log('[callFromNative]::', command);\n } catch (error) {\n console.error('[callFromNative] parse error::', error);\n }\n };\n }\n\n /**\n * 부모 통신\n * @param service\n * @param action\n * @param option\n * @returns\n */\n async callToNative<T = any>(action: BridgeAction, options?: BridgeOptions, timeout: number = 2000): Promise<T> {\n const { retainCallback: retain, ...commandOptions } = options || {};\n\n return new Promise<T>((resolve, reject) => {\n const promiseId = `${action}_${this.generatePromiseId()}`;\n console.log('[callToNative] promiseId::', promiseId);\n\n // 타임아웃 설정\n const timeoutId = setTimeout(() => {\n this.cleanupPromise(promiseId);\n reject(new Error(`Bridge call timeout: ${action}`));\n }, timeout);\n\n // 바로 window.n2bridge.promises에 저장\n window.n2bridge.promises[promiseId] = {\n resolve: (value: T) => {\n clearTimeout(timeoutId);\n resolve(value);\n },\n reject: (reason?: any) => {\n clearTimeout(timeoutId);\n reject(reason);\n },\n retain\n };\n\n try {\n const command: BridgeCommand = {\n action,\n eventName: action,\n promiseId,\n option: commandOptions\n };\n\n console.log('[callToNative] command::', command);\n\n const platform = platformDetectorUtils.getPlatform();\n\n if (platform === 'android') {\n window.n2Bridge?.callFromWeb?.(JSON.stringify(command));\n\n return;\n }\n\n if (platform === 'ios') {\n window.webkit?.messageHandlers?.n2Bridge?.postMessage(JSON.stringify(command));\n\n return;\n }\n\n if (platform === 'portal') {\n window.parent.postMessage(command, '*');\n\n return;\n }\n\n // 지원하지 않는 플랫폼\n console.warn(`[callToNative] 현재 플랫폼(${platform})에서는 지원하지 않는 서비스(${action})입니다.`);\n this.cleanupPromise(promiseId);\n reject(new Error(`Unsupported platform: ${platform}`));\n } catch (error) {\n console.error('[callToNative] error::', error);\n this.cleanupPromise(promiseId);\n reject(error);\n }\n });\n }\n\n /**\n * promiseId를 초기화 해줍니다.\n * @param promiseId\n */\n private cleanupPromise(promiseId: string): void {\n delete window.n2bridge.promises[promiseId];\n }\n}\n","import { Core } from './core/core';\n\n/**\n * App, 영업포털과 동일하게 사용가능한 기능 정의 클래스\n */\nexport class CommonBridge {\n protected core: Core;\n\n constructor() {\n this.core = new Core();\n }\n}\n","import { CommonBridge } from './common-bridge';\nimport { INativeBridge } from './types/native/native-bridge.types';\nimport { ShowWebPopupOptions } from './types/native/native-options.types';\n\n/**\n * App - Web Bridge\n */\nexport class NativeBridge extends CommonBridge implements INativeBridge {\n /**\n *\n * @param options\n * @returns\n */\n async showWebPopup<T = any>(options: ShowWebPopupOptions): Promise<T> {\n return this.core.callToNative<T>('showWebPopup', options);\n }\n\n /**\n *\n * @param options\n * @returns\n */\n async jumpSafari<T = any>(options: ShowWebPopupOptions): Promise<T> {\n return this.core.callToNative<T>('jumpSafari', options);\n }\n\n // TODO: 필요 플러그인들 추가\n}\n","import { CommonBridge } from './common-bridge';\nimport { IPortalBridge } from './types/portal/portal-bridge.types';\n\n/**\n * 영업포탈 전용 Bridge\n */\nexport class PortalBridge extends CommonBridge implements IPortalBridge {\n /**\n * 영업포탈 tab open\n * @param options\n * @returns\n */\n async openUrlWindow<T = any>(options: any): Promise<T> {\n return this.core.callToNative<T>('openUrlWindow', options);\n }\n\n // TODO: 필요 플러그인들 추가\n}\n","import { NativeBridge } from './native-bridge';\nimport { PortalBridge } from './portal-bridge';\nimport { Core } from './core/core';\n\nexport const Bridge = {\n native: new NativeBridge(),\n portal: new PortalBridge(),\n core: new Core()\n};\n"]}
package/dist/index.d.cts CHANGED
@@ -1,20 +1,3 @@
1
- /**
2
- * Actions
3
- */
4
- /** 사용가능한 브릿지 액션명 (필요시, 계속 추가)*/
5
- type CommonAction = 'logout';
6
- type NativeAction = CommonAction | 'showWebPopup';
7
- type PortalAction = CommonAction | 'openMdi';
8
- type BridgeAction = NativeAction | PortalAction;
9
- /**
10
- * Params
11
- */
12
- interface OpenUrlWindowParams {
13
- }
14
- interface LogoutParams {
15
- }
16
- interface LoginOptions {
17
- }
18
1
  interface ShowWebPopupOptions {
19
2
  /** 0: fullscreen, 1: title bar, 2: size 지정 가능 팝업, 3: wk webview */
20
3
  popupType: 0 | 1 | 2 | 3;
@@ -29,21 +12,25 @@ interface ShowWebPopupOptions {
29
12
  param: Record<string, unknown>;
30
13
  }
31
14
 
32
- type Platform = 'web' | 'android' | 'ios' | 'portal';
33
- interface ICommonBridge {
34
- logout(options: LogoutParams): Promise<any>;
35
- }
36
- interface NativeOnlyBridge {
15
+ interface INativeBridge {
37
16
  showWebPopup<T>(options: ShowWebPopupOptions): Promise<T>;
17
+ jumpSafari<T>(options: ShowWebPopupOptions): Promise<T>;
38
18
  }
39
- interface PortalOnlyBridge {
40
- openUrlWindow(options: OpenUrlWindowParams): Promise<void>;
41
- }
42
- interface INativeBridge extends ICommonBridge, NativeOnlyBridge {
19
+
20
+ type NativeAction = keyof INativeBridge;
21
+
22
+ interface OpenUrlWindowOptions {
43
23
  }
44
- interface IPortalBridge extends ICommonBridge, PortalOnlyBridge {
24
+
25
+ interface IPortalBridge {
26
+ /** Iframe에서만 지원 */
27
+ openUrlWindow(options: OpenUrlWindowOptions): Promise<void>;
45
28
  }
46
29
 
30
+ type PortalAction = keyof IPortalBridge;
31
+
32
+ type BridgeAction = NativeAction | PortalAction;
33
+
47
34
  type RetainCallback<T = any> = (params: T) => void;
48
35
  /**
49
36
  * Command의 옵션
@@ -90,7 +77,7 @@ declare class Core {
90
77
  * @param option
91
78
  * @returns
92
79
  */
93
- callToNative<T = any>(action: BridgeAction, options?: BridgeOptions): Promise<T>;
80
+ callToNative<T = any>(action: BridgeAction, options?: BridgeOptions, timeout?: number): Promise<T>;
94
81
  /**
95
82
  * promiseId를 초기화 해줍니다.
96
83
  * @param promiseId
@@ -101,13 +88,14 @@ declare class Core {
101
88
  /**
102
89
  * App, 영업포털과 동일하게 사용가능한 기능 정의 클래스
103
90
  */
104
- declare class CommonBridge implements ICommonBridge {
105
- protected platform: Platform;
91
+ declare class CommonBridge {
106
92
  protected core: Core;
107
93
  constructor();
108
- logout(options: LoginOptions): Promise<void>;
109
94
  }
110
95
 
96
+ /**
97
+ * App - Web Bridge
98
+ */
111
99
  declare class NativeBridge extends CommonBridge implements INativeBridge {
112
100
  /**
113
101
  *
@@ -115,6 +103,12 @@ declare class NativeBridge extends CommonBridge implements INativeBridge {
115
103
  * @returns
116
104
  */
117
105
  showWebPopup<T = any>(options: ShowWebPopupOptions): Promise<T>;
106
+ /**
107
+ *
108
+ * @param options
109
+ * @returns
110
+ */
111
+ jumpSafari<T = any>(options: ShowWebPopupOptions): Promise<T>;
118
112
  }
119
113
 
120
114
  /**
@@ -129,14 +123,10 @@ declare class PortalBridge extends CommonBridge implements IPortalBridge {
129
123
  openUrlWindow<T = any>(options: any): Promise<T>;
130
124
  }
131
125
 
132
- declare class Bridge {
133
- private static instance;
134
- static getInstance(): CommonBridge | NativeBridge | PortalBridge;
135
- static getCommonBridge(): CommonBridge;
136
- static getNativeBridge(): NativeBridge | null;
137
- static getPortalBridge(): PortalBridge | null;
138
- static isNativePlatform(): boolean;
139
- static isPortalPlatform(): boolean;
140
- }
126
+ declare const Bridge: {
127
+ native: NativeBridge;
128
+ portal: PortalBridge;
129
+ core: Core;
130
+ };
141
131
 
142
132
  export { Bridge };
package/dist/index.d.ts CHANGED
@@ -1,20 +1,3 @@
1
- /**
2
- * Actions
3
- */
4
- /** 사용가능한 브릿지 액션명 (필요시, 계속 추가)*/
5
- type CommonAction = 'logout';
6
- type NativeAction = CommonAction | 'showWebPopup';
7
- type PortalAction = CommonAction | 'openMdi';
8
- type BridgeAction = NativeAction | PortalAction;
9
- /**
10
- * Params
11
- */
12
- interface OpenUrlWindowParams {
13
- }
14
- interface LogoutParams {
15
- }
16
- interface LoginOptions {
17
- }
18
1
  interface ShowWebPopupOptions {
19
2
  /** 0: fullscreen, 1: title bar, 2: size 지정 가능 팝업, 3: wk webview */
20
3
  popupType: 0 | 1 | 2 | 3;
@@ -29,21 +12,25 @@ interface ShowWebPopupOptions {
29
12
  param: Record<string, unknown>;
30
13
  }
31
14
 
32
- type Platform = 'web' | 'android' | 'ios' | 'portal';
33
- interface ICommonBridge {
34
- logout(options: LogoutParams): Promise<any>;
35
- }
36
- interface NativeOnlyBridge {
15
+ interface INativeBridge {
37
16
  showWebPopup<T>(options: ShowWebPopupOptions): Promise<T>;
17
+ jumpSafari<T>(options: ShowWebPopupOptions): Promise<T>;
38
18
  }
39
- interface PortalOnlyBridge {
40
- openUrlWindow(options: OpenUrlWindowParams): Promise<void>;
41
- }
42
- interface INativeBridge extends ICommonBridge, NativeOnlyBridge {
19
+
20
+ type NativeAction = keyof INativeBridge;
21
+
22
+ interface OpenUrlWindowOptions {
43
23
  }
44
- interface IPortalBridge extends ICommonBridge, PortalOnlyBridge {
24
+
25
+ interface IPortalBridge {
26
+ /** Iframe에서만 지원 */
27
+ openUrlWindow(options: OpenUrlWindowOptions): Promise<void>;
45
28
  }
46
29
 
30
+ type PortalAction = keyof IPortalBridge;
31
+
32
+ type BridgeAction = NativeAction | PortalAction;
33
+
47
34
  type RetainCallback<T = any> = (params: T) => void;
48
35
  /**
49
36
  * Command의 옵션
@@ -90,7 +77,7 @@ declare class Core {
90
77
  * @param option
91
78
  * @returns
92
79
  */
93
- callToNative<T = any>(action: BridgeAction, options?: BridgeOptions): Promise<T>;
80
+ callToNative<T = any>(action: BridgeAction, options?: BridgeOptions, timeout?: number): Promise<T>;
94
81
  /**
95
82
  * promiseId를 초기화 해줍니다.
96
83
  * @param promiseId
@@ -101,13 +88,14 @@ declare class Core {
101
88
  /**
102
89
  * App, 영업포털과 동일하게 사용가능한 기능 정의 클래스
103
90
  */
104
- declare class CommonBridge implements ICommonBridge {
105
- protected platform: Platform;
91
+ declare class CommonBridge {
106
92
  protected core: Core;
107
93
  constructor();
108
- logout(options: LoginOptions): Promise<void>;
109
94
  }
110
95
 
96
+ /**
97
+ * App - Web Bridge
98
+ */
111
99
  declare class NativeBridge extends CommonBridge implements INativeBridge {
112
100
  /**
113
101
  *
@@ -115,6 +103,12 @@ declare class NativeBridge extends CommonBridge implements INativeBridge {
115
103
  * @returns
116
104
  */
117
105
  showWebPopup<T = any>(options: ShowWebPopupOptions): Promise<T>;
106
+ /**
107
+ *
108
+ * @param options
109
+ * @returns
110
+ */
111
+ jumpSafari<T = any>(options: ShowWebPopupOptions): Promise<T>;
118
112
  }
119
113
 
120
114
  /**
@@ -129,14 +123,10 @@ declare class PortalBridge extends CommonBridge implements IPortalBridge {
129
123
  openUrlWindow<T = any>(options: any): Promise<T>;
130
124
  }
131
125
 
132
- declare class Bridge {
133
- private static instance;
134
- static getInstance(): CommonBridge | NativeBridge | PortalBridge;
135
- static getCommonBridge(): CommonBridge;
136
- static getNativeBridge(): NativeBridge | null;
137
- static getPortalBridge(): PortalBridge | null;
138
- static isNativePlatform(): boolean;
139
- static isPortalPlatform(): boolean;
140
- }
126
+ declare const Bridge: {
127
+ native: NativeBridge;
128
+ portal: PortalBridge;
129
+ core: Core;
130
+ };
141
131
 
142
132
  export { Bridge };
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
4
4
 
5
5
  // src/bridge/utils/platform-detector-utils.ts
6
6
  var platformDetectorUtils = {
7
7
  getPlatform() {
8
- if (window.n2bridge) {
8
+ if (window.n2Bridge) {
9
9
  return "android";
10
10
  }
11
11
  if (window.webkit) {
@@ -132,12 +132,26 @@ var Core = class {
132
132
  * @param option
133
133
  * @returns
134
134
  */
135
- async callToNative(action, options) {
135
+ async callToNative(action, options, timeout = 2e3) {
136
136
  const { retainCallback: retain, ...commandOptions } = options || {};
137
137
  return new Promise((resolve, reject) => {
138
138
  const promiseId = `${action}_${this.generatePromiseId()}`;
139
139
  console.log("[callToNative] promiseId::", promiseId);
140
- window.n2bridge.promises[promiseId] = { resolve, reject, retain };
140
+ const timeoutId = setTimeout(() => {
141
+ this.cleanupPromise(promiseId);
142
+ reject(new Error(`Bridge call timeout: ${action}`));
143
+ }, timeout);
144
+ window.n2bridge.promises[promiseId] = {
145
+ resolve: (value) => {
146
+ clearTimeout(timeoutId);
147
+ resolve(value);
148
+ },
149
+ reject: (reason) => {
150
+ clearTimeout(timeoutId);
151
+ reject(reason);
152
+ },
153
+ retain
154
+ };
141
155
  try {
142
156
  const command = {
143
157
  action,
@@ -148,11 +162,11 @@ var Core = class {
148
162
  console.log("[callToNative] command::", command);
149
163
  const platform = platformDetectorUtils.getPlatform();
150
164
  if (platform === "android") {
151
- window.n2bridge?.callFromWeb?.(JSON.stringify(command));
165
+ window.n2Bridge?.callFromWeb?.(JSON.stringify(command));
152
166
  return;
153
167
  }
154
168
  if (platform === "ios") {
155
- window.webkit?.messageHandlers?.n2bridge?.postMessage(JSON.stringify(command));
169
+ window.webkit?.messageHandlers?.n2Bridge?.postMessage(JSON.stringify(command));
156
170
  return;
157
171
  }
158
172
  if (platform === "portal") {
@@ -181,16 +195,9 @@ var Core = class {
181
195
  // src/bridge/common-bridge.ts
182
196
  var CommonBridge = class {
183
197
  constructor() {
184
- __publicField(this, "platform");
185
198
  __publicField(this, "core");
186
- this.platform = platformDetectorUtils.getPlatform();
187
199
  this.core = new Core();
188
200
  }
189
- // 공통 기능 구현
190
- //! 분기가 생기면 각 클래스에서 Override
191
- async logout(options) {
192
- return this.core.callToNative("logout", options);
193
- }
194
201
  };
195
202
 
196
203
  // src/bridge/native-bridge.ts
@@ -203,6 +210,15 @@ var NativeBridge = class extends CommonBridge {
203
210
  async showWebPopup(options) {
204
211
  return this.core.callToNative("showWebPopup", options);
205
212
  }
213
+ /**
214
+ *
215
+ * @param options
216
+ * @returns
217
+ */
218
+ async jumpSafari(options) {
219
+ return this.core.callToNative("jumpSafari", options);
220
+ }
221
+ // TODO: 필요 플러그인들 추가
206
222
  };
207
223
 
208
224
  // src/bridge/portal-bridge.ts
@@ -213,57 +229,17 @@ var PortalBridge = class extends CommonBridge {
213
229
  * @returns
214
230
  */
215
231
  async openUrlWindow(options) {
216
- return this.core.callToNative("openMdi", options);
217
- }
218
- };
219
-
220
- // src/bridge/factory/bridge-factory.ts
221
- var BridgeFactory = class {
222
- static create() {
223
- const platform = platformDetectorUtils.getPlatform();
224
- switch (platform) {
225
- case "android":
226
- case "ios":
227
- return new NativeBridge();
228
- case "portal":
229
- return new PortalBridge();
230
- case "web":
231
- default:
232
- console.warn(`[BridgeFactory] \uD604\uC7AC \uD50C\uB7AB\uD3FC(${platform})\uC5D0\uC11C\uB294 Bridge \uAC1D\uCCB4\uB97C \uC0DD\uC131\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.`);
233
- return new CommonBridge();
234
- }
232
+ return this.core.callToNative("openUrlWindow", options);
235
233
  }
234
+ // TODO: 필요 플러그인들 추가
236
235
  };
237
236
 
238
237
  // src/bridge/bridge.ts
239
- var Bridge = class {
240
- static getInstance() {
241
- if (!this.instance) {
242
- this.instance = BridgeFactory.create();
243
- }
244
- return this.instance;
245
- }
246
- // 플랫폼별 접근자들만 제공
247
- static getCommonBridge() {
248
- return this.getInstance();
249
- }
250
- static getNativeBridge() {
251
- const instance = this.getInstance();
252
- return instance instanceof NativeBridge ? instance : null;
253
- }
254
- static getPortalBridge() {
255
- const instance = this.getInstance();
256
- return instance instanceof PortalBridge ? instance : null;
257
- }
258
- // 플랫폼 체크
259
- static isNativePlatform() {
260
- return this.getInstance() instanceof NativeBridge;
261
- }
262
- static isPortalPlatform() {
263
- return this.getInstance() instanceof PortalBridge;
264
- }
238
+ var Bridge = {
239
+ native: new NativeBridge(),
240
+ portal: new PortalBridge(),
241
+ core: new Core()
265
242
  };
266
- __publicField(Bridge, "instance");
267
243
 
268
244
  export { Bridge };
269
245
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bridge/utils/platform-detector-utils.ts","../src/bridge/core/core.ts","../src/bridge/common-bridge.ts","../src/bridge/native-bridge.ts","../src/bridge/portal-bridge.ts","../src/bridge/factory/bridge-factory.ts","../src/bridge/bridge.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { Platform } from '../types/common.types';\n\nexport const platformDetectorUtils = {\n getPlatform(): Platform {\n // TODO: platform 탐지는 좀 더 세밀하게 할 수 있도록 네이티브에 요청\n if (window.n2bridge) {\n return 'android';\n }\n\n if (window.webkit) {\n return 'ios';\n }\n\n if (window.self !== window.top) {\n return 'portal';\n }\n\n return 'web';\n }\n};\n","import { platformDetectorUtils } from '../utils/platform-detector-utils';\nimport { BridgeCommand, BridgeOptions, BridgePromise } from '../types/core.types';\nimport { BridgeAction } from '../types/bridge-types';\n\n/**\n * Bridge 통신 위한 핵심 클래스\n */\nexport class Core {\n constructor() {\n this.initializeWindowBridge();\n }\n\n /**\n * Promise를 처리하기 위한 고유 ID 생성\n * @returns\n */\n private generatePromiseId(): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).slice(2, 11);\n\n return `${timestamp}_${random}`;\n }\n\n /**\n * 네이티브 통신을 위해 window.n2bridge 객체 초기화\n */\n private initializeWindowBridge(): void {\n // 예외 체크\n if (!window.n2bridge) {\n window.n2bridge = {\n promises: {},\n resolvePromise: () => {},\n finallyResolvePromise: () => {},\n callFromNative: () => {}\n };\n }\n\n // 항상 최신 함수로 업데이트\n window.n2bridge.resolvePromise = this.createResolvePromiseHandler();\n window.n2bridge.finallyResolvePromise = this.createFinallyResolvePromiseHandler();\n window.n2bridge.callFromNative = this.createCallFromNativeHandler();\n }\n\n /**\n * Promise 처리 함수(Native에서 호출)\n * @returns\n */\n private createResolvePromiseHandler() {\n return (promiseId: string, data?: any, error?: any) => {\n console.log('[resolvePromise]::', promiseId, data, error);\n\n const promise: BridgePromise | undefined = window.n2bridge.promises[promiseId];\n if (!promise) {\n console.error('[resolvePromise] Promise not found::', promiseId);\n return;\n }\n\n try {\n if (error) {\n promise.reject(error);\n this.cleanupPromise(promiseId);\n return;\n }\n\n if (promise.retain) {\n promise.retain(data);\n return;\n }\n\n promise.resolve(data);\n this.cleanupPromise(promiseId);\n } catch (err) {\n console.error('[resolvePromise] Error handling promise::', err);\n this.cleanupPromise(promiseId);\n }\n };\n }\n\n /**\n * Promise 최종 처리 함수\n * @returns\n */\n private createFinallyResolvePromiseHandler() {\n return (promiseId: string, data?: any, error?: any) => {\n const promise: BridgePromise | undefined = window.n2bridge.promises[promiseId];\n if (!promise) {\n console.error('[resolvePromise] Promise not found::', promiseId);\n return;\n }\n\n try {\n if (error) {\n promise.reject(error);\n this.cleanupPromise(promiseId);\n return;\n }\n\n if (promise.retain) {\n promise.retain(data);\n return;\n }\n\n promise.resolve(data);\n this.cleanupPromise(promiseId);\n } catch (err) {\n console.error('[resolvePromise] Error handling promise::', err);\n this.cleanupPromise(promiseId);\n }\n };\n }\n\n /**\n * Native 에서 웹으로 호출하는 함수\n * TODO: 필요시 추가 코딩\n * @returns\n */\n private createCallFromNativeHandler() {\n return (jsonStr: string) => {\n try {\n const command = JSON.parse(jsonStr);\n console.log('[callFromNative]::', command);\n } catch (error) {\n console.error('[callFromNative] parse error::', error);\n }\n };\n }\n\n /**\n * 부모 통신\n * @param service\n * @param action\n * @param option\n * @returns\n */\n async callToNative<T = any>(action: BridgeAction, options?: BridgeOptions): Promise<T> {\n const { retainCallback: retain, ...commandOptions } = options || {};\n\n return new Promise<T>((resolve, reject) => {\n const promiseId = `${action}_${this.generatePromiseId()}`;\n console.log('[callToNative] promiseId::', promiseId);\n\n // 바로 window.n2bridge.promises에 저장\n window.n2bridge.promises[promiseId] = { resolve, reject, retain };\n\n try {\n const command: BridgeCommand = {\n action,\n eventName: action,\n promiseId,\n option: commandOptions\n };\n\n console.log('[callToNative] command::', command);\n\n const platform = platformDetectorUtils.getPlatform();\n\n if (platform === 'android') {\n window.n2bridge?.callFromWeb?.(JSON.stringify(command));\n\n return;\n }\n\n if (platform === 'ios') {\n window.webkit?.messageHandlers?.n2bridge?.postMessage(JSON.stringify(command));\n\n return;\n }\n\n if (platform === 'portal') {\n window.parent.postMessage(command, '*');\n\n return;\n }\n\n // 지원하지 않는 플랫폼\n console.warn(`[callToNative] 현재 플랫폼(${platform})에서는 지원하지 않는 서비스(${action})입니다.`);\n this.cleanupPromise(promiseId);\n reject(new Error(`Unsupported platform: ${platform}`));\n } catch (error) {\n console.error('[callToNative] error::', error);\n this.cleanupPromise(promiseId);\n reject(error);\n }\n });\n }\n\n /**\n * promiseId를 초기화 해줍니다.\n * @param promiseId\n */\n private cleanupPromise(promiseId: string): void {\n delete window.n2bridge.promises[promiseId];\n }\n}\n","import { ICommonBridge } from './types/common.types';\nimport { Core } from './core/core';\nimport { Platform } from './types/common.types';\nimport { platformDetectorUtils } from './utils/platform-detector-utils';\nimport { LoginOptions } from './types/bridge-types';\n\n/**\n * App, 영업포털과 동일하게 사용가능한 기능 정의 클래스\n */\nexport class CommonBridge implements ICommonBridge {\n protected platform: Platform;\n protected core: Core;\n\n constructor() {\n this.platform = platformDetectorUtils.getPlatform();\n this.core = new Core();\n }\n\n // 공통 기능 구현\n //! 분기가 생기면 각 클래스에서 Override\n async logout(options: LoginOptions): Promise<void> {\n return this.core.callToNative('logout', options);\n }\n}\n","import { INativeBridge } from './types/common.types';\nimport { CommonBridge } from './common-bridge';\nimport { ShowWebPopupOptions } from './types/bridge-types';\n\nexport class NativeBridge extends CommonBridge implements INativeBridge {\n /**\n *\n * @param options\n * @returns\n */\n async showWebPopup<T = any>(options: ShowWebPopupOptions): Promise<T> {\n return this.core.callToNative<T>('showWebPopup', options);\n }\n}\n","import { CommonBridge } from './common-bridge';\nimport { IPortalBridge } from './types/common.types';\n\n/**\n * 영업포탈 전용 Bridge\n */\nexport class PortalBridge extends CommonBridge implements IPortalBridge {\n /**\n * 영업포탈 tab open\n * @param options\n * @returns\n */\n async openUrlWindow<T = any>(options: any): Promise<T> {\n return this.core.callToNative<T>('openMdi', options);\n }\n}\n","import { platformDetectorUtils } from '../utils/platform-detector-utils';\nimport { NativeBridge } from '../native-bridge';\nimport { PortalBridge } from '../portal-bridge';\nimport { CommonBridge } from '../common-bridge';\n\n/**\n * 브릿지 객체 생성 전용 클래스\n */\nexport class BridgeFactory {\n static create(): NativeBridge | PortalBridge | CommonBridge {\n const platform = platformDetectorUtils.getPlatform();\n\n switch (platform) {\n case 'android':\n case 'ios':\n return new NativeBridge();\n\n case 'portal':\n return new PortalBridge();\n\n case 'web':\n default:\n console.warn(`[BridgeFactory] 현재 플랫폼(${platform})에서는 Bridge 객체를 생성할 수 없습니다.`);\n\n return new CommonBridge();\n }\n }\n}\n","import { NativeBridge } from './native-bridge';\nimport { PortalBridge } from './portal-bridge';\nimport { CommonBridge } from './common-bridge';\nimport { BridgeFactory } from './factory/bridge-factory';\n\nexport class Bridge {\n private static instance: NativeBridge | PortalBridge | CommonBridge;\n\n static getInstance() {\n if (!this.instance) {\n this.instance = BridgeFactory.create();\n }\n return this.instance;\n }\n\n // 플랫폼별 접근자들만 제공\n static getCommonBridge(): CommonBridge {\n return this.getInstance();\n }\n\n static getNativeBridge(): NativeBridge | null {\n const instance = this.getInstance();\n return instance instanceof NativeBridge ? instance : null;\n }\n\n static getPortalBridge(): PortalBridge | null {\n const instance = this.getInstance();\n return instance instanceof PortalBridge ? instance : null;\n }\n\n // 플랫폼 체크\n static isNativePlatform(): boolean {\n return this.getInstance() instanceof NativeBridge;\n }\n\n static isPortalPlatform(): boolean {\n return this.getInstance() instanceof PortalBridge;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/bridge/utils/platform-detector-utils.ts","../src/bridge/core/core.ts","../src/bridge/common-bridge.ts","../src/bridge/native-bridge.ts","../src/bridge/portal-bridge.ts","../src/bridge/bridge.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { Platform } from '../types/common.types';\n\nexport const platformDetectorUtils = {\n getPlatform(): Platform {\n // TODO: platform 탐지는 좀 더 세밀하게 할 수 있도록 네이티브에 요청\n if (window.n2Bridge) {\n return 'android';\n }\n\n if (window.webkit) {\n return 'ios';\n }\n\n if (window.self !== window.top) {\n return 'portal';\n }\n\n return 'web';\n }\n};\n","import { platformDetectorUtils } from '../utils/platform-detector-utils';\nimport { BridgeCommand, BridgeOptions, BridgePromise } from './core.types';\nimport { BridgeAction } from '../types/common.types';\n\n/**\n * Bridge 통신 위한 핵심 클래스\n */\nexport class Core {\n constructor() {\n this.initializeWindowBridge();\n }\n\n /**\n * Promise를 처리하기 위한 고유 ID 생성\n * @returns\n */\n private generatePromiseId(): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).slice(2, 11);\n\n return `${timestamp}_${random}`;\n }\n\n /**\n * 네이티브 통신을 위해 window.n2bridge 객체 초기화\n */\n private initializeWindowBridge(): void {\n // 예외 체크\n if (!window.n2bridge) {\n window.n2bridge = {\n promises: {},\n resolvePromise: () => {},\n finallyResolvePromise: () => {},\n callFromNative: () => {}\n };\n }\n\n // 항상 최신 함수로 업데이트\n window.n2bridge.resolvePromise = this.createResolvePromiseHandler();\n window.n2bridge.finallyResolvePromise = this.createFinallyResolvePromiseHandler();\n window.n2bridge.callFromNative = this.createCallFromNativeHandler();\n }\n\n /**\n * Promise 처리 함수(Native에서 호출)\n * @returns\n */\n private createResolvePromiseHandler() {\n return (promiseId: string, data?: any, error?: any) => {\n console.log('[resolvePromise]::', promiseId, data, error);\n\n const promise: BridgePromise | undefined = window.n2bridge.promises[promiseId];\n if (!promise) {\n console.error('[resolvePromise] Promise not found::', promiseId);\n return;\n }\n\n try {\n if (error) {\n promise.reject(error);\n this.cleanupPromise(promiseId);\n return;\n }\n\n if (promise.retain) {\n promise.retain(data);\n return;\n }\n\n promise.resolve(data);\n this.cleanupPromise(promiseId);\n } catch (err) {\n console.error('[resolvePromise] Error handling promise::', err);\n this.cleanupPromise(promiseId);\n }\n };\n }\n\n /**\n * Promise 최종 처리 함수\n * @returns\n */\n private createFinallyResolvePromiseHandler() {\n return (promiseId: string, data?: any, error?: any) => {\n const promise: BridgePromise | undefined = window.n2bridge.promises[promiseId];\n if (!promise) {\n console.error('[resolvePromise] Promise not found::', promiseId);\n return;\n }\n\n try {\n if (error) {\n promise.reject(error);\n this.cleanupPromise(promiseId);\n return;\n }\n\n if (promise.retain) {\n promise.retain(data);\n return;\n }\n\n promise.resolve(data);\n this.cleanupPromise(promiseId);\n } catch (err) {\n console.error('[resolvePromise] Error handling promise::', err);\n this.cleanupPromise(promiseId);\n }\n };\n }\n\n /**\n * Native 에서 웹으로 호출하는 함수\n * TODO: 필요시 추가 코딩\n * @returns\n */\n private createCallFromNativeHandler() {\n return (jsonStr: string) => {\n try {\n const command = JSON.parse(jsonStr);\n console.log('[callFromNative]::', command);\n } catch (error) {\n console.error('[callFromNative] parse error::', error);\n }\n };\n }\n\n /**\n * 부모 통신\n * @param service\n * @param action\n * @param option\n * @returns\n */\n async callToNative<T = any>(action: BridgeAction, options?: BridgeOptions, timeout: number = 2000): Promise<T> {\n const { retainCallback: retain, ...commandOptions } = options || {};\n\n return new Promise<T>((resolve, reject) => {\n const promiseId = `${action}_${this.generatePromiseId()}`;\n console.log('[callToNative] promiseId::', promiseId);\n\n // 타임아웃 설정\n const timeoutId = setTimeout(() => {\n this.cleanupPromise(promiseId);\n reject(new Error(`Bridge call timeout: ${action}`));\n }, timeout);\n\n // 바로 window.n2bridge.promises에 저장\n window.n2bridge.promises[promiseId] = {\n resolve: (value: T) => {\n clearTimeout(timeoutId);\n resolve(value);\n },\n reject: (reason?: any) => {\n clearTimeout(timeoutId);\n reject(reason);\n },\n retain\n };\n\n try {\n const command: BridgeCommand = {\n action,\n eventName: action,\n promiseId,\n option: commandOptions\n };\n\n console.log('[callToNative] command::', command);\n\n const platform = platformDetectorUtils.getPlatform();\n\n if (platform === 'android') {\n window.n2Bridge?.callFromWeb?.(JSON.stringify(command));\n\n return;\n }\n\n if (platform === 'ios') {\n window.webkit?.messageHandlers?.n2Bridge?.postMessage(JSON.stringify(command));\n\n return;\n }\n\n if (platform === 'portal') {\n window.parent.postMessage(command, '*');\n\n return;\n }\n\n // 지원하지 않는 플랫폼\n console.warn(`[callToNative] 현재 플랫폼(${platform})에서는 지원하지 않는 서비스(${action})입니다.`);\n this.cleanupPromise(promiseId);\n reject(new Error(`Unsupported platform: ${platform}`));\n } catch (error) {\n console.error('[callToNative] error::', error);\n this.cleanupPromise(promiseId);\n reject(error);\n }\n });\n }\n\n /**\n * promiseId를 초기화 해줍니다.\n * @param promiseId\n */\n private cleanupPromise(promiseId: string): void {\n delete window.n2bridge.promises[promiseId];\n }\n}\n","import { Core } from './core/core';\n\n/**\n * App, 영업포털과 동일하게 사용가능한 기능 정의 클래스\n */\nexport class CommonBridge {\n protected core: Core;\n\n constructor() {\n this.core = new Core();\n }\n}\n","import { CommonBridge } from './common-bridge';\nimport { INativeBridge } from './types/native/native-bridge.types';\nimport { ShowWebPopupOptions } from './types/native/native-options.types';\n\n/**\n * App - Web Bridge\n */\nexport class NativeBridge extends CommonBridge implements INativeBridge {\n /**\n *\n * @param options\n * @returns\n */\n async showWebPopup<T = any>(options: ShowWebPopupOptions): Promise<T> {\n return this.core.callToNative<T>('showWebPopup', options);\n }\n\n /**\n *\n * @param options\n * @returns\n */\n async jumpSafari<T = any>(options: ShowWebPopupOptions): Promise<T> {\n return this.core.callToNative<T>('jumpSafari', options);\n }\n\n // TODO: 필요 플러그인들 추가\n}\n","import { CommonBridge } from './common-bridge';\nimport { IPortalBridge } from './types/portal/portal-bridge.types';\n\n/**\n * 영업포탈 전용 Bridge\n */\nexport class PortalBridge extends CommonBridge implements IPortalBridge {\n /**\n * 영업포탈 tab open\n * @param options\n * @returns\n */\n async openUrlWindow<T = any>(options: any): Promise<T> {\n return this.core.callToNative<T>('openUrlWindow', options);\n }\n\n // TODO: 필요 플러그인들 추가\n}\n","import { NativeBridge } from './native-bridge';\nimport { PortalBridge } from './portal-bridge';\nimport { Core } from './core/core';\n\nexport const Bridge = {\n native: new NativeBridge(),\n portal: new PortalBridge(),\n core: new Core()\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sales-frontend-bridge",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -24,8 +24,8 @@
24
24
  "@types/node": "^22.14.0",
25
25
  "tsup": "^8.4.0",
26
26
  "typescript": "5.8.2",
27
- "eslint-config-sales-frontend-eslint-config-v8": "^0.0.5",
28
- "sales-frontend-typescript-config": "0.0.2"
27
+ "sales-frontend-typescript-config": "0.0.2",
28
+ "eslint-config-sales-frontend-eslint-config-v8": "^0.0.5"
29
29
  },
30
30
  "scripts": {
31
31
  "lint": "eslint . --max-warnings 0",