@apps-in-toss/web-framework 0.0.21 → 0.0.22

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.
@@ -1,14 +1,14 @@
1
1
  [
2
2
  {
3
3
  "platform": "ios",
4
- "totalModuleCount": 1602,
5
- "duration": 929.8815419999999,
6
- "size": 426193
4
+ "totalModuleCount": 1607,
5
+ "duration": 1126.545167,
6
+ "size": 427248
7
7
  },
8
8
  {
9
9
  "platform": "android",
10
- "totalModuleCount": 1602,
11
- "duration": 932.4692919999998,
12
- "size": 425572
10
+ "totalModuleCount": 1607,
11
+ "duration": 1137.7411670000001,
12
+ "size": 426627
13
13
  }
14
14
  ]
@@ -18,6 +18,7 @@ export * from './openCamera';
18
18
  export * from './appLogin';
19
19
  export * from './checkoutPayment';
20
20
  export * from './executePayment';
21
+ export * from './getTossShareLink';
21
22
  export * from './getOperationalEnvironment';
22
23
  export * from './getTossAppVersion';
23
24
  export * from './getDeviceId';
@@ -1 +1 @@
1
- export const createEvents=()=>({emit(event,args){for(let callbacks=this.events[event]||[],i=0,length=callbacks.length;i<length;i++){callbacks[i](args)}},events:{},on(event,cb){var _this_events,_event;((_this_events=this.events)[_event=event]||(_this_events[_event]=[])).push(cb);return()=>{var _this_events_event;this.events[event]=(_this_events_event=this.events[event])===null||_this_events_event===void 0?void 0:_this_events_event.filter(i=>cb!==i)}}});const createEventId=()=>Math.random().toString(36).substring(2,15);const deserializeError=value=>{if(value&&value.__isError){const err=new Error(value.message);err.name=value.name;err.stack=value.stack;return err}return value};window.__BEDROCK_NATIVE_EMITTER=createEvents();export function closeView(...args){if(!window.ReactNativeWebView){throw new Error("This closeView is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`closeView/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`closeView/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"closeView",eventId,args}))})}export function generateHapticFeedback(...args){if(!window.ReactNativeWebView){throw new Error("This generateHapticFeedback is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`generateHapticFeedback/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`generateHapticFeedback/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"generateHapticFeedback",eventId,args}))})}export function share(...args){if(!window.ReactNativeWebView){throw new Error("This share is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`share/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`share/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"share",eventId,args}))})}export function setSecureScreen(...args){if(!window.ReactNativeWebView){throw new Error("This setSecureScreen is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`setSecureScreen/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`setSecureScreen/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"setSecureScreen",eventId,args}))})}export function setScreenAwakeMode(...args){if(!window.ReactNativeWebView){throw new Error("This setScreenAwakeMode is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`setScreenAwakeMode/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`setScreenAwakeMode/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"setScreenAwakeMode",eventId,args}))})}export function getNetworkStatus(...args){if(!window.ReactNativeWebView){throw new Error("This getNetworkStatus is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`getNetworkStatus/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`getNetworkStatus/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"getNetworkStatus",eventId,args}))})}export function setIosSwipeGestureEnabled(...args){if(!window.ReactNativeWebView){throw new Error("This setIosSwipeGestureEnabled is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`setIosSwipeGestureEnabled/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`setIosSwipeGestureEnabled/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"setIosSwipeGestureEnabled",eventId,args}))})}export function openURL(...args){if(!window.ReactNativeWebView){throw new Error("This openURL is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`openURL/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`openURL/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"openURL",eventId,args}))})}export function getLocale(){if(!window.ReactNativeWebView){throw new Error("This getLocale is not available in browser environment")}if("getLocale"in window.__CONSTANT_HANDLER_MAP){return window.__CONSTANT_HANDLER_MAP["getLocale"]}throw new Error("getLocale is not a constant handler")}export function getSchemeUri(){if(!window.ReactNativeWebView){throw new Error("This getSchemeUri is not available in browser environment")}if("getSchemeUri"in window.__CONSTANT_HANDLER_MAP){return window.__CONSTANT_HANDLER_MAP["getSchemeUri"]}throw new Error("getSchemeUri is not a constant handler")}export function getPlatformOS(){if(!window.ReactNativeWebView){throw new Error("This getPlatformOS is not available in browser environment")}if("getPlatformOS"in window.__CONSTANT_HANDLER_MAP){return window.__CONSTANT_HANDLER_MAP["getPlatformOS"]}throw new Error("getPlatformOS is not a constant handler")}export function setClipboardText(...args){if(!window.ReactNativeWebView){throw new Error("This setClipboardText is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`setClipboardText/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`setClipboardText/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"setClipboardText",eventId,args}))})}export function getClipboardText(...args){if(!window.ReactNativeWebView){throw new Error("This getClipboardText is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`getClipboardText/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`getClipboardText/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"getClipboardText",eventId,args}))})}export function fetchContacts(...args){if(!window.ReactNativeWebView){throw new Error("This fetchContacts is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`fetchContacts/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`fetchContacts/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"fetchContacts",eventId,args}))})}export function fetchAlbumPhotos(...args){if(!window.ReactNativeWebView){throw new Error("This fetchAlbumPhotos is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`fetchAlbumPhotos/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`fetchAlbumPhotos/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"fetchAlbumPhotos",eventId,args}))})}export var Accuracy=function(Accuracy){Accuracy[Accuracy["Lowest"]=1]="Lowest";Accuracy[Accuracy["Low"]=2]="Low";Accuracy[Accuracy["Balanced"]=3]="Balanced";Accuracy[Accuracy["High"]=4]="High";Accuracy[Accuracy["Highest"]=5]="Highest";Accuracy[Accuracy["BestForNavigation"]=6]="BestForNavigation";return Accuracy}({});export function getCurrentLocation(...args){if(!window.ReactNativeWebView){throw new Error("This getCurrentLocation is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`getCurrentLocation/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`getCurrentLocation/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"getCurrentLocation",eventId,args}))})}export function openCamera(...args){if(!window.ReactNativeWebView){throw new Error("This openCamera is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`openCamera/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`openCamera/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"openCamera",eventId,args}))})}export function appLogin(...args){if(!window.ReactNativeWebView){throw new Error("This appLogin is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`appLogin/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`appLogin/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"appLogin",eventId,args}))})}export function checkoutPayment(...args){if(!window.ReactNativeWebView){throw new Error("This checkoutPayment is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`checkoutPayment/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`checkoutPayment/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"checkoutPayment",eventId,args}))})}export function executePayment(...args){if(!window.ReactNativeWebView){throw new Error("This executePayment is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`executePayment/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`executePayment/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"executePayment",eventId,args}))})}export function getOperationalEnvironment(){if(!window.ReactNativeWebView){throw new Error("This getOperationalEnvironment is not available in browser environment")}if("getOperationalEnvironment"in window.__CONSTANT_HANDLER_MAP){return window.__CONSTANT_HANDLER_MAP["getOperationalEnvironment"]}throw new Error("getOperationalEnvironment is not a constant handler")}export function getTossAppVersion(){if(!window.ReactNativeWebView){throw new Error("This getTossAppVersion is not available in browser environment")}if("getTossAppVersion"in window.__CONSTANT_HANDLER_MAP){return window.__CONSTANT_HANDLER_MAP["getTossAppVersion"]}throw new Error("getTossAppVersion is not a constant handler")}export function getDeviceId(){if(!window.ReactNativeWebView){throw new Error("This getDeviceId is not available in browser environment")}if("getDeviceId"in window.__CONSTANT_HANDLER_MAP){return window.__CONSTANT_HANDLER_MAP["getDeviceId"]}throw new Error("getDeviceId is not a constant handler")}export function startUpdateLocation({onEvent,onError,options}){if(!window.ReactNativeWebView){onError(new Error("This startUpdateLocation is not available in browser environment"));return()=>{}}const eventId=createEventId();const removes=[window.__BEDROCK_NATIVE_EMITTER.on(`startUpdateLocation/onEvent/${eventId}`,response=>{onEvent(response)}),window.__BEDROCK_NATIVE_EMITTER.on(`startUpdateLocation/onError/${eventId}`,error=>{onError(deserializeError(error))})];window.ReactNativeWebView.postMessage(JSON.stringify({type:"addEventListener",functionName:"startUpdateLocation",eventId,args:options}));return()=>{window.ReactNativeWebView.postMessage(JSON.stringify({type:"removeEventListener",functionName:"startUpdateLocation",eventId}));for(const remove of removes){remove()}}}
1
+ import{createAsyncBridge,createConstantBridge,createEventBridge}from"@apps-in-toss/bridge-core";var createEvents=function(){return{emit:function emit(event,args){for(var callbacks=this.events[event]||[],i=0,length=callbacks.length;i<length;i++){callbacks[i](args)}},events:{},on:function on(event,cb){var _this=this;var _this_events,_event;((_this_events=this.events)[_event=event]||(_this_events[_event]=[])).push(cb);return function(){var _this_events_event;_this.events[event]=(_this_events_event=_this.events[event])===null||_this_events_event===void 0?void 0:_this_events_event.filter(function(i){return cb!==i})}}}};if(typeof window!=="undefined"){window.__BEDROCK_NATIVE_EMITTER=createEvents()}export var closeView=createAsyncBridge("closeView");export var generateHapticFeedback=createAsyncBridge("generateHapticFeedback");export var share=createAsyncBridge("share");export var setSecureScreen=createAsyncBridge("setSecureScreen");export var setScreenAwakeMode=createAsyncBridge("setScreenAwakeMode");export var getNetworkStatus=createAsyncBridge("getNetworkStatus");export var setIosSwipeGestureEnabled=createAsyncBridge("setIosSwipeGestureEnabled");export var openURL=createAsyncBridge("openURL");export var getLocale=createConstantBridge("getLocale");export var getSchemeUri=createConstantBridge("getSchemeUri");export var getPlatformOS=createConstantBridge("getPlatformOS");export var setClipboardText=createAsyncBridge("setClipboardText");export var getClipboardText=createAsyncBridge("getClipboardText");export var fetchContacts=createAsyncBridge("fetchContacts");export var fetchAlbumPhotos=createAsyncBridge("fetchAlbumPhotos");export var Accuracy=function(Accuracy){Accuracy[Accuracy["Lowest"]=1]="Lowest";Accuracy[Accuracy["Low"]=2]="Low";Accuracy[Accuracy["Balanced"]=3]="Balanced";Accuracy[Accuracy["High"]=4]="High";Accuracy[Accuracy["Highest"]=5]="Highest";Accuracy[Accuracy["BestForNavigation"]=6]="BestForNavigation";return Accuracy}({});export var getCurrentLocation=createAsyncBridge("getCurrentLocation");export var openCamera=createAsyncBridge("openCamera");export var appLogin=createAsyncBridge("appLogin");export var checkoutPayment=createAsyncBridge("checkoutPayment");export var executePayment=createAsyncBridge("executePayment");export var getTossShareLink=createAsyncBridge("getTossShareLink");export var getOperationalEnvironment=createConstantBridge("getOperationalEnvironment");export var getTossAppVersion=createConstantBridge("getTossAppVersion");export var getDeviceId=createConstantBridge("getDeviceId");export var startUpdateLocation=createEventBridge("startUpdateLocation");
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @public
3
+ * @category 공유
4
+ * @kind function
5
+ * @name getTossShareLink
6
+ * @description
7
+ * `getTossShareLink` 함수는 사용자가 지정한 경로를 토스 앱에서 열 수 공유 링크를 반환해요.
8
+ * 이 링크를 다른 사람과 공유하면 토스 앱이 실행되면서 지정한 경로로 진입해요. 토스앱이 없는 사람은 iOS 일 때는 앱스토어로 이동하고, Android 일 때는 플레이스토어로 이동해요.
9
+ *
10
+ * 경로는 토스 앱 내부 특정 화면을 나타내는 딥링크(deep link) 형식이어야 해요.
11
+ * 예를 들어 `intoss://<앱 이름>`이나 `intoss://<앱 이름>/about?name=test`처럼 작성해요.
12
+ *
13
+ * 이 함수를 사용하면 `deep_link_value`를 포함한 완성된 공유 링크를 만들 수 있어요.
14
+ *
15
+ * @param path - 딥링크로 열고 싶은 경로예요. `intoss://`로 시작하는 문자열이어야 해요.
16
+ * @returns {Promise<string>} `deep_link_value`가 포함된 토스 공유 링크를 반환해요.
17
+ *
18
+ * @example
19
+ * ```tsx
20
+ * import { getTossShareLink, share } from '@apps-in-toss/web-framework';
21
+ *
22
+ * // '/' 경로를 딥링크로 포함한 토스 공유 링크를 생성해요.
23
+ * const tossLink = await getTossShareLink('intoss://my-app');
24
+ *
25
+ * // 생성한 링크를 메시지로 공유해요.
26
+ * await share({ message: tossLink });
27
+ * ```
28
+ */
29
+ export declare function getTossShareLink(path: string): Promise<string>;
30
+
31
+ export {};
@@ -1,71 +1,5 @@
1
- export * from './bridge'
2
- /**
3
- * 비동기 브릿지 함수 생성
4
- * @param method 호출할 메서드 이름
5
- * @returns args를 받아 Promise를 반환하는 함수
6
- * @typeParam T: 인자로 전달할 데이터 타입
7
- * @typeParam R: resolve 시 반환될 데이터 타입 (기본 any)
8
- * @example
9
- * // 카메라 열기 브릿지 함수 생성
10
- * const openCamera = createAsyncBridge<{base64: boolean}, { dataUri: string }>('openCamera');
11
- *
12
- * // 사용 예시
13
- * async function takePicture() {
14
- * try {
15
- * const result = await openCamera();
16
- * console.log('카메라로 찍은 이미지 URL:', result.dataUri);
17
- * } catch (error) {
18
- * console.error('카메라 오류:', error);
19
- * }
20
- * }
21
- */
22
- declare function createAsyncBridge<T extends any[], R = any>(method: string): (...args: T) => Promise<R>;
23
-
24
- /**
25
- * 상수 브릿지 함수 생성
26
- * @param method 호출할 상수 핸들러 이름
27
- * @returns 상수 값을 반환하는 함수
28
- * @typeParam T: 상수 값의 타입
29
- * @example
30
- * // 디바이스 ID를 가져오는 상수 브릿지 생성
31
- * const getDeviceId = createConstantBridge<string>('getDeviceId');
32
- *
33
- * // 사용 예시
34
- * function displayDeviceInfo() {
35
- * const deviceId = getDeviceId();
36
- * console.log('디바이스 ID:', deviceId);
37
- * }
38
- */
39
- declare function createConstantBridge<T>(method: string): () => T;
40
-
41
- /**
42
- * 이벤트 브릿지 함수 생성
43
- * @param method 호출할 이벤트 핸들러 이름
44
- * @returns 이벤트 및 에러 핸들러를 포함한 객체를 받아 리스너 해제 함수를 반환하는 함수
45
- * @typeParam T: 이벤트 관련 추가 옵션 등의 타입
46
- * @example
47
- * // 위치 추적 이벤트 브릿지 생성
48
- * const startUpdatingLocation = createEventBridge<{ interval: number }>('startUpdatingLocation');
49
- *
50
- * // 사용 예시
51
- * const unsubscribe = startUpdatingLocation({
52
- * options: { interval: 1000 }, // 1초마다 위치 업데이트
53
- * onEvent: (location) => {
54
- * console.log('현재 위치:', location.latitude, location.longitude);
55
- * },
56
- * onError: (error) => {
57
- * console.error('위치 추적 오류:', error);
58
- * }
59
- * });
60
- *
61
- * // 위치 추적 중단
62
- * unsubscribe();
63
- */
64
- declare function createEventBridge<TOptions, TData>(method: string): (args: {
65
- onEvent: (data: TData) => void;
66
- onError: (error: Error) => void;
67
- options?: TOptions;
68
- }) => () => void;
1
+ export * from './bridge';
2
+ export * from '@apps-in-toss/bridge-core';
69
3
 
70
4
  /**
71
5
  * @public
@@ -167,4 +101,4 @@ declare const bedrockEvent: {
167
101
  }) => () => void;
168
102
  };
169
103
 
170
- export { type BedrockEvent, Storage, bedrockEvent, createAsyncBridge, createConstantBridge, createEventBridge, getSafeAreaInsets };
104
+ export { type BedrockEvent, Storage, bedrockEvent, getSafeAreaInsets };
package/dist-web/index.js CHANGED
@@ -1,144 +1,10 @@
1
1
  export * from './bridge.js'
2
2
 
3
- // src-web/nativeWindow.ts
4
- var NativeWindow = class {
5
- get _window() {
6
- return window;
7
- }
8
- /**
9
- * ReactNativeWebView를 이용해 메시지를 전송합니다.
10
- * @param message 전송할 메시지(JSON 문자열)
11
- * @example
12
- * const nativeWindow = new NativeWindow();
13
- * nativeWindow.postMessage({ type: 'method', functionName: 'getDeviceId', eventId: '123', args: [] });
14
- */
15
- postMessage(message) {
16
- const webView = this._window.ReactNativeWebView;
17
- if (!webView) {
18
- throw new Error("ReactNativeWebView is not available in browser environment");
19
- }
20
- webView.postMessage(JSON.stringify(message));
21
- }
22
- /**
23
- * __BEDROCK_NATIVE_EMITTER를 이용해 이벤트 리스너를 등록합니다.
24
- * @param event 이벤트 이름
25
- * @param callback 데이터가 도착했을 때 호출되는 콜백
26
- * @returns 리스너 해제 함수
27
- * @example
28
- * const nativeWindow = new NativeWindow();
29
- * const unsubscribe = nativeWindow.on('deviceInfo', (data) => {
30
- * console.log('Device info received:', data);
31
- * });
32
- *
33
- * // 리스너 해제
34
- * unsubscribe();
35
- */
36
- on(event, callback) {
37
- const emitter = this._window.__BEDROCK_NATIVE_EMITTER;
38
- if (!emitter) {
39
- throw new Error("__BEDROCK_NATIVE_EMITTER is not available");
40
- }
41
- return emitter.on(event, callback);
42
- }
43
- /**
44
- * __CONSTANT_HANDLER_MAP에 등록된 상수 값을 반환합니다.
45
- * @param method 상수 핸들러 이름
46
- * @returns 상수 값
47
- * @example
48
- * const nativeWindow = new NativeWindow();
49
- * const deviceId = nativeWindow.getConstant('getDeviceId');
50
- * console.log('Device ID:', deviceId);
51
- */
52
- getConstant(method) {
53
- const constantHandlerMap = this._window.__CONSTANT_HANDLER_MAP;
54
- if (constantHandlerMap && method in constantHandlerMap) {
55
- return constantHandlerMap[method];
56
- }
57
- throw new Error(`${method} is not a constant handler`);
58
- }
59
- };
60
- var nativeWindow = new NativeWindow();
61
- var createEventId = () => Math.random().toString(36).substring(2, 15);
62
- var deserializeError = (value) => {
63
- if (value && value.__isError) {
64
- const err = new Error(value.message);
65
- err.name = value.name;
66
- err.stack = value.stack;
67
- return err;
68
- }
69
- return value;
70
- };
71
-
72
- // src-web/createAsyncBridge.ts
73
- function createAsyncBridge(method) {
74
- return (...args) => {
75
- const eventId = createEventId();
76
- const emitters = [];
77
- const unsubscribe = () => {
78
- for (const remove of emitters) {
79
- remove();
80
- }
81
- };
82
- return new Promise((resolve, reject) => {
83
- emitters.push(
84
- nativeWindow.on(`${method}/resolve/${eventId}`, (data) => {
85
- unsubscribe();
86
- resolve(data);
87
- })
88
- );
89
- emitters.push(
90
- nativeWindow.on(`${method}/reject/${eventId}`, (error) => {
91
- unsubscribe();
92
- reject(deserializeError(error));
93
- })
94
- );
95
- nativeWindow.postMessage({
96
- type: "method",
97
- functionName: method,
98
- eventId,
99
- args
100
- });
101
- });
102
- };
103
- }
104
-
105
- // src-web/createConstantBridge.ts
106
- function createConstantBridge(method) {
107
- return () => {
108
- return nativeWindow.getConstant(method);
109
- };
110
- }
111
-
112
- // src-web/createEventBridge.ts
113
- function createEventBridge(method) {
114
- return (args) => {
115
- const eventId = createEventId();
116
- const removes = [
117
- nativeWindow.on(`${method}/onEvent/${eventId}`, (data) => {
118
- args.onEvent(data);
119
- }),
120
- nativeWindow.on(`${method}/onError/${eventId}`, (error) => {
121
- args.onError(deserializeError(error));
122
- })
123
- ];
124
- nativeWindow.postMessage({
125
- type: "addEventListener",
126
- functionName: method,
127
- eventId,
128
- args: args.options
129
- });
130
- return () => {
131
- nativeWindow.postMessage({
132
- type: "removeEventListener",
133
- functionName: method,
134
- eventId
135
- });
136
- removes.forEach((remove) => remove());
137
- };
138
- };
139
- }
3
+ // src-web/index.ts
4
+ export * from "@apps-in-toss/bridge-core";
140
5
 
141
6
  // src-web/storage.ts
7
+ import { createAsyncBridge } from "@apps-in-toss/bridge-core";
142
8
  var Storage = {
143
9
  /**
144
10
  * @public
@@ -210,6 +76,7 @@ var Storage = {
210
76
  };
211
77
 
212
78
  // src-web/getSafeAreaInsets.ts
79
+ import { createConstantBridge } from "@apps-in-toss/bridge-core";
213
80
  var getSafeAreaBottom = createConstantBridge("getSafeAreaBottom");
214
81
  var getSafeAreaTop = createConstantBridge("getSafeAreaTop");
215
82
  function getSafeAreaInsets() {
@@ -217,6 +84,7 @@ function getSafeAreaInsets() {
217
84
  }
218
85
 
219
86
  // src-web/bedrockEvent.ts
87
+ import { createEventBridge } from "@apps-in-toss/bridge-core";
220
88
  var bedrockEvent = {
221
89
  addEventListener: (event, {
222
90
  onEvent,
@@ -232,8 +100,5 @@ var bedrockEvent = {
232
100
  export {
233
101
  Storage,
234
102
  bedrockEvent,
235
- createAsyncBridge,
236
- createConstantBridge,
237
- createEventBridge,
238
103
  getSafeAreaInsets
239
104
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@apps-in-toss/web-framework",
3
3
  "type": "module",
4
- "version": "0.0.21",
4
+ "version": "0.0.22",
5
5
  "description": "Web Framework for Apps In Toss",
6
6
  "scripts": {
7
7
  "prepack": "yarn build",
@@ -51,7 +51,9 @@
51
51
  "config.d.ts"
52
52
  ],
53
53
  "devDependencies": {
54
- "@apps-in-toss/framework": "0.0.21",
54
+ "@apps-in-toss-internal/bridgepack": "^0.0.22",
55
+ "@apps-in-toss/bridge-core": "workspace:*",
56
+ "@apps-in-toss/framework": "0.0.22",
55
57
  "@babel/plugin-proposal-class-properties": "^7.16.7",
56
58
  "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
57
59
  "@babel/plugin-proposal-numeric-separator": "^7.16.7",
@@ -67,10 +69,9 @@
67
69
  "@babel/types": "^7.26.9",
68
70
  "@clack/prompts": "^0.10.0",
69
71
  "@hono/node-server": "^1.13.8",
70
- "@react-native-bedrock/bridgepack": "0.0.20",
71
- "@react-native-bedrock/cli": "0.0.20",
72
- "@react-native-bedrock/mpack-next": "0.0.20",
73
- "@react-native-bedrock/native": "0.0.20",
72
+ "@react-native-bedrock/cli": "0.0.21",
73
+ "@react-native-bedrock/mpack-next": "0.0.21",
74
+ "@react-native-bedrock/native": "0.0.21",
74
75
  "@toss-design-system/react-native": "^0.5.1",
75
76
  "@types/babel__core": "^7.20.5",
76
77
  "@types/babel__traverse": "^7",
@@ -91,23 +92,24 @@
91
92
  "picocolors": "^1.1.1",
92
93
  "react": "18.2.0",
93
94
  "react-native": "0.72.6",
94
- "react-native-bedrock": "0.0.20",
95
+ "react-native-bedrock": "0.0.21",
95
96
  "tsup": "^8.3.5",
96
97
  "typescript": "4.9.5",
97
98
  "uuidv7": "^1.0.2",
98
99
  "vitest": "^3.0.5",
99
100
  "wait-port": "^1.1.0",
100
101
  "workspace-tools": "^0.38.2",
102
+ "yauzl": "^3.2.0",
101
103
  "zod": "^3.24.1"
102
104
  },
103
105
  "dependencies": {
104
- "@apps-in-toss/cli": "0.0.21",
105
- "@apps-in-toss/plugins": "0.0.21",
106
- "@babel/core": "7.23.9",
107
- "yauzl": "^3.2.0"
106
+ "@apps-in-toss/bridge-core": "0.0.22",
107
+ "@apps-in-toss/cli": "0.0.22",
108
+ "@apps-in-toss/plugins": "0.0.22",
109
+ "@babel/core": "7.23.9"
108
110
  },
109
111
  "publishConfig": {
110
112
  "access": "public"
111
113
  },
112
- "gitHead": "9dad7250017dbe59829ccb6a399138c4421ebe93"
114
+ "gitHead": "2a6cea952ba0db69fc2f0c9a94a190b9dfabe8ef"
113
115
  }