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 +3 -1
- package/dist/index.cjs +35 -59
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +30 -40
- package/dist/index.d.ts +30 -40
- package/dist/index.js +35 -59
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
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,
|
|
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.
|
|
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
|
-
|
|
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.
|
|
167
|
+
window.n2Bridge?.callFromWeb?.(JSON.stringify(command));
|
|
154
168
|
return;
|
|
155
169
|
}
|
|
156
170
|
if (platform === "ios") {
|
|
157
|
-
window.webkit?.messageHandlers?.
|
|
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("
|
|
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 =
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
package/dist/index.cjs.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.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":"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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 './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
|
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
interface
|
|
19
|
+
|
|
20
|
+
type NativeAction = keyof INativeBridge;
|
|
21
|
+
|
|
22
|
+
interface OpenUrlWindowOptions {
|
|
43
23
|
}
|
|
44
|
-
|
|
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
|
|
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
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
interface
|
|
19
|
+
|
|
20
|
+
type NativeAction = keyof INativeBridge;
|
|
21
|
+
|
|
22
|
+
interface OpenUrlWindowOptions {
|
|
43
23
|
}
|
|
44
|
-
|
|
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
|
|
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
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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,
|
|
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.
|
|
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
|
-
|
|
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.
|
|
165
|
+
window.n2Bridge?.callFromWeb?.(JSON.stringify(command));
|
|
152
166
|
return;
|
|
153
167
|
}
|
|
154
168
|
if (platform === "ios") {
|
|
155
|
-
window.webkit?.messageHandlers?.
|
|
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("
|
|
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 =
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
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.
|
|
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
|
-
"
|
|
28
|
-
"sales-frontend-
|
|
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",
|