@apps-in-toss/web-bridge 1.1.2 → 1.1.3
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/built/index.cjs +173 -117
- package/built/index.d.cts +39 -8
- package/built/index.d.ts +39 -8
- package/built/index.js +179 -123
- package/package.json +5 -5
package/built/index.cjs
CHANGED
|
@@ -117,17 +117,112 @@ var Storage = {
|
|
|
117
117
|
};
|
|
118
118
|
|
|
119
119
|
// src/iap.ts
|
|
120
|
+
var import_bridge_core3 = require("@apps-in-toss/bridge-core");
|
|
121
|
+
|
|
122
|
+
// src/isMinVersionSupported.ts
|
|
120
123
|
var import_bridge_core2 = require("@apps-in-toss/bridge-core");
|
|
124
|
+
|
|
125
|
+
// src/utils/compareVersion.ts
|
|
126
|
+
var SEMVER_REGEX = /^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\\-]+(?:\.[\da-z\\-]+)*))?(?:\+[\da-z\\-]+(?:\.[\da-z\\-]+)*)?)?)?$/i;
|
|
127
|
+
var isWildcard = (val) => ["*", "x", "X"].includes(val);
|
|
128
|
+
var tryParse = (val) => {
|
|
129
|
+
const num = parseInt(val, 10);
|
|
130
|
+
return isNaN(num) ? val : num;
|
|
131
|
+
};
|
|
132
|
+
var coerceTypes = (a, b) => {
|
|
133
|
+
return typeof a === typeof b ? [a, b] : [String(a), String(b)];
|
|
134
|
+
};
|
|
135
|
+
var compareValues = (a, b) => {
|
|
136
|
+
if (isWildcard(a) || isWildcard(b)) {
|
|
137
|
+
return 0;
|
|
138
|
+
}
|
|
139
|
+
const [aVal, bVal] = coerceTypes(tryParse(a), tryParse(b));
|
|
140
|
+
if (aVal > bVal) {
|
|
141
|
+
return 1;
|
|
142
|
+
}
|
|
143
|
+
if (aVal < bVal) {
|
|
144
|
+
return -1;
|
|
145
|
+
}
|
|
146
|
+
return 0;
|
|
147
|
+
};
|
|
148
|
+
var parseVersion = (version) => {
|
|
149
|
+
if (typeof version !== "string") {
|
|
150
|
+
throw new TypeError("Invalid argument: expected a string");
|
|
151
|
+
}
|
|
152
|
+
const match = version.match(SEMVER_REGEX);
|
|
153
|
+
if (!match) {
|
|
154
|
+
throw new Error(`Invalid semver: '${version}'`);
|
|
155
|
+
}
|
|
156
|
+
const [, major, minor, patch, build, preRelease] = match;
|
|
157
|
+
return [major, minor, patch, build, preRelease];
|
|
158
|
+
};
|
|
159
|
+
var compareSegments = (a, b) => {
|
|
160
|
+
const maxLength = Math.max(a.length, b.length);
|
|
161
|
+
for (let i = 0; i < maxLength; i++) {
|
|
162
|
+
const segA = a[i] ?? "0";
|
|
163
|
+
const segB = b[i] ?? "0";
|
|
164
|
+
const result = compareValues(segA, segB);
|
|
165
|
+
if (result !== 0) {
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return 0;
|
|
170
|
+
};
|
|
171
|
+
var compareVersions = (v1, v2) => {
|
|
172
|
+
const seg1 = parseVersion(v1);
|
|
173
|
+
const seg2 = parseVersion(v2);
|
|
174
|
+
const preRelease1 = seg1.pop();
|
|
175
|
+
const preRelease2 = seg2.pop();
|
|
176
|
+
const mainCompare = compareSegments(seg1, seg2);
|
|
177
|
+
if (mainCompare !== 0) {
|
|
178
|
+
return mainCompare;
|
|
179
|
+
}
|
|
180
|
+
if (preRelease1 && preRelease2) {
|
|
181
|
+
return compareSegments(preRelease1.split("."), preRelease2.split("."));
|
|
182
|
+
}
|
|
183
|
+
if (preRelease1) {
|
|
184
|
+
return -1;
|
|
185
|
+
}
|
|
186
|
+
if (preRelease2) {
|
|
187
|
+
return 1;
|
|
188
|
+
}
|
|
189
|
+
return 0;
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
// src/isMinVersionSupported.ts
|
|
193
|
+
function isMinVersionSupported(minVersions) {
|
|
194
|
+
const operationalEnvironment = (0, import_bridge_core2.createConstantBridge)("getOperationalEnvironment")();
|
|
195
|
+
if (operationalEnvironment === "sandbox") {
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
const currentVersion = (0, import_bridge_core2.createConstantBridge)("getTossAppVersion")();
|
|
199
|
+
const isIOS = (0, import_bridge_core2.createConstantBridge)("getPlatformOS")() === "ios";
|
|
200
|
+
const minVersion = isIOS ? minVersions.ios : minVersions.android;
|
|
201
|
+
if (minVersion === void 0) {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
if (minVersion === "always") {
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
if (minVersion === "never") {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
return compareVersions(currentVersion, minVersion) >= 0;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// src/iap.ts
|
|
214
|
+
function processProductGrant(params) {
|
|
215
|
+
return (0, import_bridge_core3.createAsyncBridge)("processProductGrant")(params);
|
|
216
|
+
}
|
|
121
217
|
var IAP = {
|
|
122
218
|
/**
|
|
123
219
|
* @public
|
|
124
220
|
* @category 인앱결제
|
|
125
|
-
* @name
|
|
221
|
+
* @name createOneTimePurchaseOrder
|
|
126
222
|
* @description
|
|
127
223
|
* 특정 인앱결제 주문서 페이지로 이동해요. 사용자가 상품 구매 버튼을 누르는 상황 등에 사용할 수 있어요. 사용자의 결제는 이동한 페이지에서 진행돼요. 만약 결제 중에 에러가 발생하면 에러 유형에 따라 에러 페이지로 이동해요.
|
|
128
224
|
* @param {IapCreateOneTimePurchaseOrderOptions} params - 인앱결제를 생성할 때 필요한 정보예요.
|
|
129
|
-
* @
|
|
130
|
-
* @returns {Promise<IapCreateOneTimePurchaseOrderResult | undefined>} 결제에 성공하면 결제 결과 객체를 반환해요. 앱 버전이 최소 지원 버전(안드로이드 5.219.0, iOS 5.219.0)보다 낮으면 인앱결제를 실행할 수 없어서 `undefined`를 반환해요.
|
|
225
|
+
* @returns {() => void} 앱브릿지 cleanup 함수를 반환해요. 인앱결제 기능이 끝나면 반드시 이 함수를 호출해서 리소스를 해제해야 해요.
|
|
131
226
|
*
|
|
132
227
|
* @throw {code: "INVALID_PRODUCT_ID"} - 유효하지 않은 상품 ID이거나, 해당 상품이 존재하지 않을 때 발생해요.
|
|
133
228
|
* @throw {code: "PAYMENT_PENDING"} - 사용자가 요청한 결제가 아직 승인을 기다리고 있을 때 발생해요.
|
|
@@ -139,30 +234,82 @@ var IAP = {
|
|
|
139
234
|
* @throw {code: "INTERNAL_ERROR"} - 서버 내부 문제로 요청을 처리할 수 없을 때 발생해요.
|
|
140
235
|
* @throw {code: "KOREAN_ACCOUNT_ONLY"} - iOS 환경에서 사용자의 계정이 한국 계정이 아닐 때 발생해요.
|
|
141
236
|
* @throw {code: "USER_CANCELED"} - 사용자가 결제를 완료하지 않고 주문서 페이지를 이탈했을 때 발생해요.
|
|
237
|
+
* @throw {code: "PRODUCT_NOT_GRANTED_BY_PARTNER"} - 파트너사의 상품 지급이 실패했을 때 발생해요.
|
|
142
238
|
*/
|
|
143
|
-
createOneTimePurchaseOrder: (
|
|
144
|
-
|
|
145
|
-
|
|
239
|
+
createOneTimePurchaseOrder: (params) => {
|
|
240
|
+
const isIAPSupported = isMinVersionSupported({
|
|
241
|
+
android: "5.219.0",
|
|
242
|
+
ios: "5.219.0"
|
|
243
|
+
});
|
|
244
|
+
const noop = () => {
|
|
245
|
+
};
|
|
246
|
+
if (!isIAPSupported) {
|
|
247
|
+
return noop;
|
|
248
|
+
}
|
|
249
|
+
const isProcessProductGrantSupported = isMinVersionSupported({
|
|
250
|
+
android: "5.230.0",
|
|
251
|
+
ios: "5.230.0"
|
|
252
|
+
});
|
|
253
|
+
const { options, onEvent, onError } = params;
|
|
254
|
+
const sku = options.sku ?? options.productId;
|
|
255
|
+
if (!isProcessProductGrantSupported) {
|
|
256
|
+
const v1 = () => {
|
|
257
|
+
(0, import_bridge_core3.createAsyncBridge)(
|
|
258
|
+
"iapCreateOneTimePurchaseOrder"
|
|
259
|
+
)({
|
|
260
|
+
productId: sku
|
|
261
|
+
}).then((response) => {
|
|
262
|
+
Promise.resolve(options.processProductGrant({ orderId: response.orderId })).then(() => {
|
|
263
|
+
onEvent({ type: "success", data: response });
|
|
264
|
+
}).catch((error) => {
|
|
265
|
+
onError(error);
|
|
266
|
+
});
|
|
267
|
+
}).catch((error) => {
|
|
268
|
+
onError(error);
|
|
269
|
+
});
|
|
270
|
+
return noop;
|
|
271
|
+
};
|
|
272
|
+
return v1();
|
|
273
|
+
}
|
|
274
|
+
const unregisterCallbacks = (0, import_bridge_core3.createEventBridge)("requestOneTimePurchase")({
|
|
275
|
+
options: { sku },
|
|
276
|
+
onEvent: async (event) => {
|
|
277
|
+
if (event.type === "purchased") {
|
|
278
|
+
const isProductGranted = await options.processProductGrant({ orderId: event.data.orderId });
|
|
279
|
+
await processProductGrant({
|
|
280
|
+
orderId: event.data.orderId,
|
|
281
|
+
isProductGranted
|
|
282
|
+
}).catch(onError);
|
|
283
|
+
} else {
|
|
284
|
+
onEvent(event);
|
|
285
|
+
}
|
|
286
|
+
},
|
|
287
|
+
onError: (error) => {
|
|
288
|
+
onError(error);
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
return unregisterCallbacks;
|
|
292
|
+
},
|
|
146
293
|
/**
|
|
147
294
|
* @public
|
|
148
295
|
* @category 인앱결제
|
|
149
|
-
* @name
|
|
296
|
+
* @name getProductItemList
|
|
150
297
|
* @description 인앱결제로 구매할 수 있는 상품 목록을 가져와요. 상품 목록 화면에 진입할 때 호출해요.
|
|
151
298
|
* @returns {Promise<{ products: IapProductListItem[] } | undefined>} 상품 목록을 포함한 객체를 반환해요. 앱 버전이 최소 지원 버전(안드로이드 5.219.0, iOS 5.219.0)보다 낮으면 `undefined`를 반환해요.
|
|
152
299
|
*/
|
|
153
|
-
getProductItemList: (0,
|
|
300
|
+
getProductItemList: (0, import_bridge_core3.createAsyncBridge)("iapGetProductItemList")
|
|
154
301
|
};
|
|
155
302
|
|
|
156
303
|
// src/getSafeAreaInsets.ts
|
|
157
|
-
var
|
|
158
|
-
var getSafeAreaBottom = (0,
|
|
159
|
-
var getSafeAreaTop = (0,
|
|
304
|
+
var import_bridge_core4 = require("@apps-in-toss/bridge-core");
|
|
305
|
+
var getSafeAreaBottom = (0, import_bridge_core4.createConstantBridge)("getSafeAreaBottom");
|
|
306
|
+
var getSafeAreaTop = (0, import_bridge_core4.createConstantBridge)("getSafeAreaTop");
|
|
160
307
|
function getSafeAreaInsets() {
|
|
161
308
|
return { top: getSafeAreaTop(), bottom: getSafeAreaBottom() };
|
|
162
309
|
}
|
|
163
310
|
|
|
164
311
|
// src/googleAdMob.ts
|
|
165
|
-
var
|
|
312
|
+
var import_bridge_core5 = require("@apps-in-toss/bridge-core");
|
|
166
313
|
var GoogleAdMob = {
|
|
167
314
|
/**
|
|
168
315
|
* @public
|
|
@@ -213,9 +360,9 @@ var GoogleAdMob = {
|
|
|
213
360
|
* ```
|
|
214
361
|
*/
|
|
215
362
|
loadAdMobInterstitialAd: Object.assign(
|
|
216
|
-
(0,
|
|
363
|
+
(0, import_bridge_core5.createEventBridge)("loadAdMobInterstitialAd"),
|
|
217
364
|
{
|
|
218
|
-
isSupported: (0,
|
|
365
|
+
isSupported: (0, import_bridge_core5.createConstantBridge)("loadAdMobInterstitialAd_isSupported")
|
|
219
366
|
}
|
|
220
367
|
),
|
|
221
368
|
/**
|
|
@@ -288,9 +435,9 @@ var GoogleAdMob = {
|
|
|
288
435
|
* ```
|
|
289
436
|
*/
|
|
290
437
|
showAdMobInterstitialAd: Object.assign(
|
|
291
|
-
(0,
|
|
438
|
+
(0, import_bridge_core5.createEventBridge)("showAdMobInterstitialAd"),
|
|
292
439
|
{
|
|
293
|
-
isSupported: (0,
|
|
440
|
+
isSupported: (0, import_bridge_core5.createConstantBridge)("showAdMobInterstitialAd_isSupported")
|
|
294
441
|
}
|
|
295
442
|
),
|
|
296
443
|
/**
|
|
@@ -342,9 +489,9 @@ var GoogleAdMob = {
|
|
|
342
489
|
* ```
|
|
343
490
|
*/
|
|
344
491
|
loadAdMobRewardedAd: Object.assign(
|
|
345
|
-
(0,
|
|
492
|
+
(0, import_bridge_core5.createEventBridge)("loadAdMobRewardedAd"),
|
|
346
493
|
{
|
|
347
|
-
isSupported: (0,
|
|
494
|
+
isSupported: (0, import_bridge_core5.createConstantBridge)("loadAdMobRewardedAd_isSupported")
|
|
348
495
|
}
|
|
349
496
|
),
|
|
350
497
|
/**
|
|
@@ -417,9 +564,9 @@ var GoogleAdMob = {
|
|
|
417
564
|
* ```
|
|
418
565
|
*/
|
|
419
566
|
showAdMobRewardedAd: Object.assign(
|
|
420
|
-
(0,
|
|
567
|
+
(0, import_bridge_core5.createEventBridge)("showAdMobRewardedAd"),
|
|
421
568
|
{
|
|
422
|
-
isSupported: (0,
|
|
569
|
+
isSupported: (0, import_bridge_core5.createConstantBridge)("showAdMobRewardedAd_isSupported")
|
|
423
570
|
}
|
|
424
571
|
),
|
|
425
572
|
/**
|
|
@@ -476,8 +623,8 @@ var GoogleAdMob = {
|
|
|
476
623
|
* }
|
|
477
624
|
* ```
|
|
478
625
|
*/
|
|
479
|
-
loadAppsInTossAdMob: Object.assign((0,
|
|
480
|
-
isSupported: (0,
|
|
626
|
+
loadAppsInTossAdMob: Object.assign((0, import_bridge_core5.createEventBridge)("loadAppsInTossAdMob"), {
|
|
627
|
+
isSupported: (0, import_bridge_core5.createConstantBridge)("loadAppsInTossAdMob_isSupported")
|
|
481
628
|
}),
|
|
482
629
|
/**
|
|
483
630
|
* @public
|
|
@@ -554,19 +701,19 @@ var GoogleAdMob = {
|
|
|
554
701
|
* }
|
|
555
702
|
* ```
|
|
556
703
|
*/
|
|
557
|
-
showAppsInTossAdMob: Object.assign((0,
|
|
558
|
-
isSupported: (0,
|
|
704
|
+
showAppsInTossAdMob: Object.assign((0, import_bridge_core5.createEventBridge)("showAppsInTossAdMob"), {
|
|
705
|
+
isSupported: (0, import_bridge_core5.createConstantBridge)("showAppsInTossAdMob_isSupported")
|
|
559
706
|
})
|
|
560
707
|
};
|
|
561
708
|
|
|
562
709
|
// src/graniteEvent.ts
|
|
563
|
-
var
|
|
710
|
+
var import_bridge_core6 = require("@apps-in-toss/bridge-core");
|
|
564
711
|
var graniteEvent = {
|
|
565
712
|
addEventListener: (event, {
|
|
566
713
|
onEvent,
|
|
567
714
|
onError,
|
|
568
715
|
options
|
|
569
|
-
}) => (0,
|
|
716
|
+
}) => (0, import_bridge_core6.createEventBridge)(event)({
|
|
570
717
|
onEvent,
|
|
571
718
|
onError: onError ?? (() => {
|
|
572
719
|
}),
|
|
@@ -574,97 +721,6 @@ var graniteEvent = {
|
|
|
574
721
|
})
|
|
575
722
|
};
|
|
576
723
|
|
|
577
|
-
// src/isMinVersionSupported.ts
|
|
578
|
-
var import_bridge_core6 = require("@apps-in-toss/bridge-core");
|
|
579
|
-
|
|
580
|
-
// src/utils/compareVersion.ts
|
|
581
|
-
var SEMVER_REGEX = /^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\\-]+(?:\.[\da-z\\-]+)*))?(?:\+[\da-z\\-]+(?:\.[\da-z\\-]+)*)?)?)?$/i;
|
|
582
|
-
var isWildcard = (val) => ["*", "x", "X"].includes(val);
|
|
583
|
-
var tryParse = (val) => {
|
|
584
|
-
const num = parseInt(val, 10);
|
|
585
|
-
return isNaN(num) ? val : num;
|
|
586
|
-
};
|
|
587
|
-
var coerceTypes = (a, b) => {
|
|
588
|
-
return typeof a === typeof b ? [a, b] : [String(a), String(b)];
|
|
589
|
-
};
|
|
590
|
-
var compareValues = (a, b) => {
|
|
591
|
-
if (isWildcard(a) || isWildcard(b)) {
|
|
592
|
-
return 0;
|
|
593
|
-
}
|
|
594
|
-
const [aVal, bVal] = coerceTypes(tryParse(a), tryParse(b));
|
|
595
|
-
if (aVal > bVal) {
|
|
596
|
-
return 1;
|
|
597
|
-
}
|
|
598
|
-
if (aVal < bVal) {
|
|
599
|
-
return -1;
|
|
600
|
-
}
|
|
601
|
-
return 0;
|
|
602
|
-
};
|
|
603
|
-
var parseVersion = (version) => {
|
|
604
|
-
if (typeof version !== "string") {
|
|
605
|
-
throw new TypeError("Invalid argument: expected a string");
|
|
606
|
-
}
|
|
607
|
-
const match = version.match(SEMVER_REGEX);
|
|
608
|
-
if (!match) {
|
|
609
|
-
throw new Error(`Invalid semver: '${version}'`);
|
|
610
|
-
}
|
|
611
|
-
const [, major, minor, patch, build, preRelease] = match;
|
|
612
|
-
return [major, minor, patch, build, preRelease];
|
|
613
|
-
};
|
|
614
|
-
var compareSegments = (a, b) => {
|
|
615
|
-
const maxLength = Math.max(a.length, b.length);
|
|
616
|
-
for (let i = 0; i < maxLength; i++) {
|
|
617
|
-
const segA = a[i] ?? "0";
|
|
618
|
-
const segB = b[i] ?? "0";
|
|
619
|
-
const result = compareValues(segA, segB);
|
|
620
|
-
if (result !== 0) {
|
|
621
|
-
return result;
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
return 0;
|
|
625
|
-
};
|
|
626
|
-
var compareVersions = (v1, v2) => {
|
|
627
|
-
const seg1 = parseVersion(v1);
|
|
628
|
-
const seg2 = parseVersion(v2);
|
|
629
|
-
const preRelease1 = seg1.pop();
|
|
630
|
-
const preRelease2 = seg2.pop();
|
|
631
|
-
const mainCompare = compareSegments(seg1, seg2);
|
|
632
|
-
if (mainCompare !== 0) {
|
|
633
|
-
return mainCompare;
|
|
634
|
-
}
|
|
635
|
-
if (preRelease1 && preRelease2) {
|
|
636
|
-
return compareSegments(preRelease1.split("."), preRelease2.split("."));
|
|
637
|
-
}
|
|
638
|
-
if (preRelease1) {
|
|
639
|
-
return -1;
|
|
640
|
-
}
|
|
641
|
-
if (preRelease2) {
|
|
642
|
-
return 1;
|
|
643
|
-
}
|
|
644
|
-
return 0;
|
|
645
|
-
};
|
|
646
|
-
|
|
647
|
-
// src/isMinVersionSupported.ts
|
|
648
|
-
function isMinVersionSupported(minVersions) {
|
|
649
|
-
const operationalEnvironment = (0, import_bridge_core6.createConstantBridge)("getOperationalEnvironment")();
|
|
650
|
-
if (operationalEnvironment === "sandbox") {
|
|
651
|
-
return true;
|
|
652
|
-
}
|
|
653
|
-
const currentVersion = (0, import_bridge_core6.createConstantBridge)("getTossAppVersion")();
|
|
654
|
-
const isIOS = (0, import_bridge_core6.createConstantBridge)("getPlatformOS")() === "ios";
|
|
655
|
-
const minVersion = isIOS ? minVersions.ios : minVersions.android;
|
|
656
|
-
if (minVersion === void 0) {
|
|
657
|
-
return false;
|
|
658
|
-
}
|
|
659
|
-
if (minVersion === "always") {
|
|
660
|
-
return true;
|
|
661
|
-
}
|
|
662
|
-
if (minVersion === "never") {
|
|
663
|
-
return false;
|
|
664
|
-
}
|
|
665
|
-
return compareVersions(currentVersion, minVersion) >= 0;
|
|
666
|
-
}
|
|
667
|
-
|
|
668
724
|
// src/appsInTossEvent.ts
|
|
669
725
|
var import_bridge_core7 = require("@apps-in-toss/bridge-core");
|
|
670
726
|
var appsInTossEvent = {
|
package/built/index.d.cts
CHANGED
|
@@ -85,6 +85,16 @@ declare const Storage: {
|
|
|
85
85
|
clearItems: (args_0: void) => Promise<void>;
|
|
86
86
|
};
|
|
87
87
|
|
|
88
|
+
type Sku = {
|
|
89
|
+
/**
|
|
90
|
+
* @deprecated `productId`는 더 이상 사용하지 않아요. 대신 `sku`를 사용해요.
|
|
91
|
+
*/
|
|
92
|
+
productId: string;
|
|
93
|
+
sku?: string;
|
|
94
|
+
} | {
|
|
95
|
+
productId?: never;
|
|
96
|
+
sku: string;
|
|
97
|
+
};
|
|
88
98
|
/**
|
|
89
99
|
* @public
|
|
90
100
|
* @category 인앱결제
|
|
@@ -107,6 +117,29 @@ interface IapCreateOneTimePurchaseOrderResult {
|
|
|
107
117
|
fraction: number;
|
|
108
118
|
miniAppIconUrl: string | null;
|
|
109
119
|
}
|
|
120
|
+
interface SuccessEvent {
|
|
121
|
+
type: 'success';
|
|
122
|
+
data: IapCreateOneTimePurchaseOrderResult;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* @public
|
|
126
|
+
* @category 인앱결제
|
|
127
|
+
* @name IapCreateOneTimePurchaseOrderOptions
|
|
128
|
+
* @property {Sku} options - 결제할 상품의 정보예요.
|
|
129
|
+
* @property {string} options.sku - 주문할 상품의 고유 ID예요.
|
|
130
|
+
* @property {(params: { orderId: string }) => boolean | Promise<boolean>} processProductGrant - 주문이 만들어진 뒤 실제로 상품을 지급할 때 호출해요. `orderId`를 받아서 지급 성공 여부를 `true` 또는 `Promise<true>`로 반환해요. 지급에 실패하면 `false`를 반환해요.
|
|
131
|
+
* @property {(event: SuccessEvent) => void | Promise<void>} onEvent - 결제가 성공했을 때 호출해요. `event.type`이 `'success'`이고, `event.data`에 `IapCreateOneTimePurchaseOrderResult`가 들어 있어요.
|
|
132
|
+
* @property {(error: unknown) => void | Promise<void>} onError - 결제 과정에서 에러가 발생했을 때 호출해요. 에러 객체를 받아서 로깅하거나 복구 절차를 실행할 수 있어요.
|
|
133
|
+
*/
|
|
134
|
+
interface IapCreateOneTimePurchaseOrderOptions {
|
|
135
|
+
options: Sku & {
|
|
136
|
+
processProductGrant: (params: {
|
|
137
|
+
orderId: string;
|
|
138
|
+
}) => boolean | Promise<boolean>;
|
|
139
|
+
};
|
|
140
|
+
onEvent: (event: SuccessEvent) => void | Promise<void>;
|
|
141
|
+
onError: (error: unknown) => void | Promise<void>;
|
|
142
|
+
}
|
|
110
143
|
/**
|
|
111
144
|
* @public
|
|
112
145
|
* @category 인앱결제
|
|
@@ -137,12 +170,11 @@ declare const IAP: {
|
|
|
137
170
|
/**
|
|
138
171
|
* @public
|
|
139
172
|
* @category 인앱결제
|
|
140
|
-
* @name
|
|
173
|
+
* @name createOneTimePurchaseOrder
|
|
141
174
|
* @description
|
|
142
175
|
* 특정 인앱결제 주문서 페이지로 이동해요. 사용자가 상품 구매 버튼을 누르는 상황 등에 사용할 수 있어요. 사용자의 결제는 이동한 페이지에서 진행돼요. 만약 결제 중에 에러가 발생하면 에러 유형에 따라 에러 페이지로 이동해요.
|
|
143
176
|
* @param {IapCreateOneTimePurchaseOrderOptions} params - 인앱결제를 생성할 때 필요한 정보예요.
|
|
144
|
-
* @
|
|
145
|
-
* @returns {Promise<IapCreateOneTimePurchaseOrderResult | undefined>} 결제에 성공하면 결제 결과 객체를 반환해요. 앱 버전이 최소 지원 버전(안드로이드 5.219.0, iOS 5.219.0)보다 낮으면 인앱결제를 실행할 수 없어서 `undefined`를 반환해요.
|
|
177
|
+
* @returns {() => void} 앱브릿지 cleanup 함수를 반환해요. 인앱결제 기능이 끝나면 반드시 이 함수를 호출해서 리소스를 해제해야 해요.
|
|
146
178
|
*
|
|
147
179
|
* @throw {code: "INVALID_PRODUCT_ID"} - 유효하지 않은 상품 ID이거나, 해당 상품이 존재하지 않을 때 발생해요.
|
|
148
180
|
* @throw {code: "PAYMENT_PENDING"} - 사용자가 요청한 결제가 아직 승인을 기다리고 있을 때 발생해요.
|
|
@@ -154,14 +186,13 @@ declare const IAP: {
|
|
|
154
186
|
* @throw {code: "INTERNAL_ERROR"} - 서버 내부 문제로 요청을 처리할 수 없을 때 발생해요.
|
|
155
187
|
* @throw {code: "KOREAN_ACCOUNT_ONLY"} - iOS 환경에서 사용자의 계정이 한국 계정이 아닐 때 발생해요.
|
|
156
188
|
* @throw {code: "USER_CANCELED"} - 사용자가 결제를 완료하지 않고 주문서 페이지를 이탈했을 때 발생해요.
|
|
189
|
+
* @throw {code: "PRODUCT_NOT_GRANTED_BY_PARTNER"} - 파트너사의 상품 지급이 실패했을 때 발생해요.
|
|
157
190
|
*/
|
|
158
|
-
createOneTimePurchaseOrder: (
|
|
159
|
-
productId: string;
|
|
160
|
-
}) => Promise<IapCreateOneTimePurchaseOrderResult>;
|
|
191
|
+
createOneTimePurchaseOrder: (params: IapCreateOneTimePurchaseOrderOptions) => () => void;
|
|
161
192
|
/**
|
|
162
193
|
* @public
|
|
163
194
|
* @category 인앱결제
|
|
164
|
-
* @name
|
|
195
|
+
* @name getProductItemList
|
|
165
196
|
* @description 인앱결제로 구매할 수 있는 상품 목록을 가져와요. 상품 목록 화면에 진입할 때 호출해요.
|
|
166
197
|
* @returns {Promise<{ products: IapProductListItem[] } | undefined>} 상품 목록을 포함한 객체를 반환해요. 앱 버전이 최소 지원 버전(안드로이드 5.219.0, iOS 5.219.0)보다 낮으면 `undefined`를 반환해요.
|
|
167
198
|
*/
|
|
@@ -787,4 +818,4 @@ declare const startUpdateLocation: {
|
|
|
787
818
|
openPermissionDialog(): Promise<"denied" | "allowed">;
|
|
788
819
|
};
|
|
789
820
|
|
|
790
|
-
export { type AddAccessoryButtonOptions, type AppsInTossEvent, type AppsInTossGlobals, GoogleAdMob, type GraniteEvent, IAP, type
|
|
821
|
+
export { type AddAccessoryButtonOptions, type AppsInTossEvent, type AppsInTossGlobals, GoogleAdMob, type GraniteEvent, IAP, type IapCreateOneTimePurchaseOrderOptions, type IapProductListItem, Storage, type TdsEvent, appsInTossEvent, env, fetchAlbumPhotos, fetchContacts, getAppsInTossGlobals, getClipboardText, getCurrentLocation, getSafeAreaInsets, graniteEvent, isMinVersionSupported, openCamera, partner, setClipboardText, startUpdateLocation, tdsEvent };
|
package/built/index.d.ts
CHANGED
|
@@ -85,6 +85,16 @@ declare const Storage: {
|
|
|
85
85
|
clearItems: (args_0: void) => Promise<void>;
|
|
86
86
|
};
|
|
87
87
|
|
|
88
|
+
type Sku = {
|
|
89
|
+
/**
|
|
90
|
+
* @deprecated `productId`는 더 이상 사용하지 않아요. 대신 `sku`를 사용해요.
|
|
91
|
+
*/
|
|
92
|
+
productId: string;
|
|
93
|
+
sku?: string;
|
|
94
|
+
} | {
|
|
95
|
+
productId?: never;
|
|
96
|
+
sku: string;
|
|
97
|
+
};
|
|
88
98
|
/**
|
|
89
99
|
* @public
|
|
90
100
|
* @category 인앱결제
|
|
@@ -107,6 +117,29 @@ interface IapCreateOneTimePurchaseOrderResult {
|
|
|
107
117
|
fraction: number;
|
|
108
118
|
miniAppIconUrl: string | null;
|
|
109
119
|
}
|
|
120
|
+
interface SuccessEvent {
|
|
121
|
+
type: 'success';
|
|
122
|
+
data: IapCreateOneTimePurchaseOrderResult;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* @public
|
|
126
|
+
* @category 인앱결제
|
|
127
|
+
* @name IapCreateOneTimePurchaseOrderOptions
|
|
128
|
+
* @property {Sku} options - 결제할 상품의 정보예요.
|
|
129
|
+
* @property {string} options.sku - 주문할 상품의 고유 ID예요.
|
|
130
|
+
* @property {(params: { orderId: string }) => boolean | Promise<boolean>} processProductGrant - 주문이 만들어진 뒤 실제로 상품을 지급할 때 호출해요. `orderId`를 받아서 지급 성공 여부를 `true` 또는 `Promise<true>`로 반환해요. 지급에 실패하면 `false`를 반환해요.
|
|
131
|
+
* @property {(event: SuccessEvent) => void | Promise<void>} onEvent - 결제가 성공했을 때 호출해요. `event.type`이 `'success'`이고, `event.data`에 `IapCreateOneTimePurchaseOrderResult`가 들어 있어요.
|
|
132
|
+
* @property {(error: unknown) => void | Promise<void>} onError - 결제 과정에서 에러가 발생했을 때 호출해요. 에러 객체를 받아서 로깅하거나 복구 절차를 실행할 수 있어요.
|
|
133
|
+
*/
|
|
134
|
+
interface IapCreateOneTimePurchaseOrderOptions {
|
|
135
|
+
options: Sku & {
|
|
136
|
+
processProductGrant: (params: {
|
|
137
|
+
orderId: string;
|
|
138
|
+
}) => boolean | Promise<boolean>;
|
|
139
|
+
};
|
|
140
|
+
onEvent: (event: SuccessEvent) => void | Promise<void>;
|
|
141
|
+
onError: (error: unknown) => void | Promise<void>;
|
|
142
|
+
}
|
|
110
143
|
/**
|
|
111
144
|
* @public
|
|
112
145
|
* @category 인앱결제
|
|
@@ -137,12 +170,11 @@ declare const IAP: {
|
|
|
137
170
|
/**
|
|
138
171
|
* @public
|
|
139
172
|
* @category 인앱결제
|
|
140
|
-
* @name
|
|
173
|
+
* @name createOneTimePurchaseOrder
|
|
141
174
|
* @description
|
|
142
175
|
* 특정 인앱결제 주문서 페이지로 이동해요. 사용자가 상품 구매 버튼을 누르는 상황 등에 사용할 수 있어요. 사용자의 결제는 이동한 페이지에서 진행돼요. 만약 결제 중에 에러가 발생하면 에러 유형에 따라 에러 페이지로 이동해요.
|
|
143
176
|
* @param {IapCreateOneTimePurchaseOrderOptions} params - 인앱결제를 생성할 때 필요한 정보예요.
|
|
144
|
-
* @
|
|
145
|
-
* @returns {Promise<IapCreateOneTimePurchaseOrderResult | undefined>} 결제에 성공하면 결제 결과 객체를 반환해요. 앱 버전이 최소 지원 버전(안드로이드 5.219.0, iOS 5.219.0)보다 낮으면 인앱결제를 실행할 수 없어서 `undefined`를 반환해요.
|
|
177
|
+
* @returns {() => void} 앱브릿지 cleanup 함수를 반환해요. 인앱결제 기능이 끝나면 반드시 이 함수를 호출해서 리소스를 해제해야 해요.
|
|
146
178
|
*
|
|
147
179
|
* @throw {code: "INVALID_PRODUCT_ID"} - 유효하지 않은 상품 ID이거나, 해당 상품이 존재하지 않을 때 발생해요.
|
|
148
180
|
* @throw {code: "PAYMENT_PENDING"} - 사용자가 요청한 결제가 아직 승인을 기다리고 있을 때 발생해요.
|
|
@@ -154,14 +186,13 @@ declare const IAP: {
|
|
|
154
186
|
* @throw {code: "INTERNAL_ERROR"} - 서버 내부 문제로 요청을 처리할 수 없을 때 발생해요.
|
|
155
187
|
* @throw {code: "KOREAN_ACCOUNT_ONLY"} - iOS 환경에서 사용자의 계정이 한국 계정이 아닐 때 발생해요.
|
|
156
188
|
* @throw {code: "USER_CANCELED"} - 사용자가 결제를 완료하지 않고 주문서 페이지를 이탈했을 때 발생해요.
|
|
189
|
+
* @throw {code: "PRODUCT_NOT_GRANTED_BY_PARTNER"} - 파트너사의 상품 지급이 실패했을 때 발생해요.
|
|
157
190
|
*/
|
|
158
|
-
createOneTimePurchaseOrder: (
|
|
159
|
-
productId: string;
|
|
160
|
-
}) => Promise<IapCreateOneTimePurchaseOrderResult>;
|
|
191
|
+
createOneTimePurchaseOrder: (params: IapCreateOneTimePurchaseOrderOptions) => () => void;
|
|
161
192
|
/**
|
|
162
193
|
* @public
|
|
163
194
|
* @category 인앱결제
|
|
164
|
-
* @name
|
|
195
|
+
* @name getProductItemList
|
|
165
196
|
* @description 인앱결제로 구매할 수 있는 상품 목록을 가져와요. 상품 목록 화면에 진입할 때 호출해요.
|
|
166
197
|
* @returns {Promise<{ products: IapProductListItem[] } | undefined>} 상품 목록을 포함한 객체를 반환해요. 앱 버전이 최소 지원 버전(안드로이드 5.219.0, iOS 5.219.0)보다 낮으면 `undefined`를 반환해요.
|
|
167
198
|
*/
|
|
@@ -787,4 +818,4 @@ declare const startUpdateLocation: {
|
|
|
787
818
|
openPermissionDialog(): Promise<"denied" | "allowed">;
|
|
788
819
|
};
|
|
789
820
|
|
|
790
|
-
export { type AddAccessoryButtonOptions, type AppsInTossEvent, type AppsInTossGlobals, GoogleAdMob, type GraniteEvent, IAP, type
|
|
821
|
+
export { type AddAccessoryButtonOptions, type AppsInTossEvent, type AppsInTossGlobals, GoogleAdMob, type GraniteEvent, IAP, type IapCreateOneTimePurchaseOrderOptions, type IapProductListItem, Storage, type TdsEvent, appsInTossEvent, env, fetchAlbumPhotos, fetchContacts, getAppsInTossGlobals, getClipboardText, getCurrentLocation, getSafeAreaInsets, graniteEvent, isMinVersionSupported, openCamera, partner, setClipboardText, startUpdateLocation, tdsEvent };
|
package/built/index.js
CHANGED
|
@@ -76,17 +76,112 @@ var Storage = {
|
|
|
76
76
|
};
|
|
77
77
|
|
|
78
78
|
// src/iap.ts
|
|
79
|
-
import { createAsyncBridge as createAsyncBridge2 } from "@apps-in-toss/bridge-core";
|
|
79
|
+
import { createAsyncBridge as createAsyncBridge2, createEventBridge } from "@apps-in-toss/bridge-core";
|
|
80
|
+
|
|
81
|
+
// src/isMinVersionSupported.ts
|
|
82
|
+
import { createConstantBridge } from "@apps-in-toss/bridge-core";
|
|
83
|
+
|
|
84
|
+
// src/utils/compareVersion.ts
|
|
85
|
+
var SEMVER_REGEX = /^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\\-]+(?:\.[\da-z\\-]+)*))?(?:\+[\da-z\\-]+(?:\.[\da-z\\-]+)*)?)?)?$/i;
|
|
86
|
+
var isWildcard = (val) => ["*", "x", "X"].includes(val);
|
|
87
|
+
var tryParse = (val) => {
|
|
88
|
+
const num = parseInt(val, 10);
|
|
89
|
+
return isNaN(num) ? val : num;
|
|
90
|
+
};
|
|
91
|
+
var coerceTypes = (a, b) => {
|
|
92
|
+
return typeof a === typeof b ? [a, b] : [String(a), String(b)];
|
|
93
|
+
};
|
|
94
|
+
var compareValues = (a, b) => {
|
|
95
|
+
if (isWildcard(a) || isWildcard(b)) {
|
|
96
|
+
return 0;
|
|
97
|
+
}
|
|
98
|
+
const [aVal, bVal] = coerceTypes(tryParse(a), tryParse(b));
|
|
99
|
+
if (aVal > bVal) {
|
|
100
|
+
return 1;
|
|
101
|
+
}
|
|
102
|
+
if (aVal < bVal) {
|
|
103
|
+
return -1;
|
|
104
|
+
}
|
|
105
|
+
return 0;
|
|
106
|
+
};
|
|
107
|
+
var parseVersion = (version) => {
|
|
108
|
+
if (typeof version !== "string") {
|
|
109
|
+
throw new TypeError("Invalid argument: expected a string");
|
|
110
|
+
}
|
|
111
|
+
const match = version.match(SEMVER_REGEX);
|
|
112
|
+
if (!match) {
|
|
113
|
+
throw new Error(`Invalid semver: '${version}'`);
|
|
114
|
+
}
|
|
115
|
+
const [, major, minor, patch, build, preRelease] = match;
|
|
116
|
+
return [major, minor, patch, build, preRelease];
|
|
117
|
+
};
|
|
118
|
+
var compareSegments = (a, b) => {
|
|
119
|
+
const maxLength = Math.max(a.length, b.length);
|
|
120
|
+
for (let i = 0; i < maxLength; i++) {
|
|
121
|
+
const segA = a[i] ?? "0";
|
|
122
|
+
const segB = b[i] ?? "0";
|
|
123
|
+
const result = compareValues(segA, segB);
|
|
124
|
+
if (result !== 0) {
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return 0;
|
|
129
|
+
};
|
|
130
|
+
var compareVersions = (v1, v2) => {
|
|
131
|
+
const seg1 = parseVersion(v1);
|
|
132
|
+
const seg2 = parseVersion(v2);
|
|
133
|
+
const preRelease1 = seg1.pop();
|
|
134
|
+
const preRelease2 = seg2.pop();
|
|
135
|
+
const mainCompare = compareSegments(seg1, seg2);
|
|
136
|
+
if (mainCompare !== 0) {
|
|
137
|
+
return mainCompare;
|
|
138
|
+
}
|
|
139
|
+
if (preRelease1 && preRelease2) {
|
|
140
|
+
return compareSegments(preRelease1.split("."), preRelease2.split("."));
|
|
141
|
+
}
|
|
142
|
+
if (preRelease1) {
|
|
143
|
+
return -1;
|
|
144
|
+
}
|
|
145
|
+
if (preRelease2) {
|
|
146
|
+
return 1;
|
|
147
|
+
}
|
|
148
|
+
return 0;
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
// src/isMinVersionSupported.ts
|
|
152
|
+
function isMinVersionSupported(minVersions) {
|
|
153
|
+
const operationalEnvironment = createConstantBridge("getOperationalEnvironment")();
|
|
154
|
+
if (operationalEnvironment === "sandbox") {
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
const currentVersion = createConstantBridge("getTossAppVersion")();
|
|
158
|
+
const isIOS = createConstantBridge("getPlatformOS")() === "ios";
|
|
159
|
+
const minVersion = isIOS ? minVersions.ios : minVersions.android;
|
|
160
|
+
if (minVersion === void 0) {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
if (minVersion === "always") {
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
if (minVersion === "never") {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
return compareVersions(currentVersion, minVersion) >= 0;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// src/iap.ts
|
|
173
|
+
function processProductGrant(params) {
|
|
174
|
+
return createAsyncBridge2("processProductGrant")(params);
|
|
175
|
+
}
|
|
80
176
|
var IAP = {
|
|
81
177
|
/**
|
|
82
178
|
* @public
|
|
83
179
|
* @category 인앱결제
|
|
84
|
-
* @name
|
|
180
|
+
* @name createOneTimePurchaseOrder
|
|
85
181
|
* @description
|
|
86
182
|
* 특정 인앱결제 주문서 페이지로 이동해요. 사용자가 상품 구매 버튼을 누르는 상황 등에 사용할 수 있어요. 사용자의 결제는 이동한 페이지에서 진행돼요. 만약 결제 중에 에러가 발생하면 에러 유형에 따라 에러 페이지로 이동해요.
|
|
87
183
|
* @param {IapCreateOneTimePurchaseOrderOptions} params - 인앱결제를 생성할 때 필요한 정보예요.
|
|
88
|
-
* @
|
|
89
|
-
* @returns {Promise<IapCreateOneTimePurchaseOrderResult | undefined>} 결제에 성공하면 결제 결과 객체를 반환해요. 앱 버전이 최소 지원 버전(안드로이드 5.219.0, iOS 5.219.0)보다 낮으면 인앱결제를 실행할 수 없어서 `undefined`를 반환해요.
|
|
184
|
+
* @returns {() => void} 앱브릿지 cleanup 함수를 반환해요. 인앱결제 기능이 끝나면 반드시 이 함수를 호출해서 리소스를 해제해야 해요.
|
|
90
185
|
*
|
|
91
186
|
* @throw {code: "INVALID_PRODUCT_ID"} - 유효하지 않은 상품 ID이거나, 해당 상품이 존재하지 않을 때 발생해요.
|
|
92
187
|
* @throw {code: "PAYMENT_PENDING"} - 사용자가 요청한 결제가 아직 승인을 기다리고 있을 때 발생해요.
|
|
@@ -98,14 +193,66 @@ var IAP = {
|
|
|
98
193
|
* @throw {code: "INTERNAL_ERROR"} - 서버 내부 문제로 요청을 처리할 수 없을 때 발생해요.
|
|
99
194
|
* @throw {code: "KOREAN_ACCOUNT_ONLY"} - iOS 환경에서 사용자의 계정이 한국 계정이 아닐 때 발생해요.
|
|
100
195
|
* @throw {code: "USER_CANCELED"} - 사용자가 결제를 완료하지 않고 주문서 페이지를 이탈했을 때 발생해요.
|
|
196
|
+
* @throw {code: "PRODUCT_NOT_GRANTED_BY_PARTNER"} - 파트너사의 상품 지급이 실패했을 때 발생해요.
|
|
101
197
|
*/
|
|
102
|
-
createOneTimePurchaseOrder:
|
|
103
|
-
|
|
104
|
-
|
|
198
|
+
createOneTimePurchaseOrder: (params) => {
|
|
199
|
+
const isIAPSupported = isMinVersionSupported({
|
|
200
|
+
android: "5.219.0",
|
|
201
|
+
ios: "5.219.0"
|
|
202
|
+
});
|
|
203
|
+
const noop = () => {
|
|
204
|
+
};
|
|
205
|
+
if (!isIAPSupported) {
|
|
206
|
+
return noop;
|
|
207
|
+
}
|
|
208
|
+
const isProcessProductGrantSupported = isMinVersionSupported({
|
|
209
|
+
android: "5.230.0",
|
|
210
|
+
ios: "5.230.0"
|
|
211
|
+
});
|
|
212
|
+
const { options, onEvent, onError } = params;
|
|
213
|
+
const sku = options.sku ?? options.productId;
|
|
214
|
+
if (!isProcessProductGrantSupported) {
|
|
215
|
+
const v1 = () => {
|
|
216
|
+
createAsyncBridge2(
|
|
217
|
+
"iapCreateOneTimePurchaseOrder"
|
|
218
|
+
)({
|
|
219
|
+
productId: sku
|
|
220
|
+
}).then((response) => {
|
|
221
|
+
Promise.resolve(options.processProductGrant({ orderId: response.orderId })).then(() => {
|
|
222
|
+
onEvent({ type: "success", data: response });
|
|
223
|
+
}).catch((error) => {
|
|
224
|
+
onError(error);
|
|
225
|
+
});
|
|
226
|
+
}).catch((error) => {
|
|
227
|
+
onError(error);
|
|
228
|
+
});
|
|
229
|
+
return noop;
|
|
230
|
+
};
|
|
231
|
+
return v1();
|
|
232
|
+
}
|
|
233
|
+
const unregisterCallbacks = createEventBridge("requestOneTimePurchase")({
|
|
234
|
+
options: { sku },
|
|
235
|
+
onEvent: async (event) => {
|
|
236
|
+
if (event.type === "purchased") {
|
|
237
|
+
const isProductGranted = await options.processProductGrant({ orderId: event.data.orderId });
|
|
238
|
+
await processProductGrant({
|
|
239
|
+
orderId: event.data.orderId,
|
|
240
|
+
isProductGranted
|
|
241
|
+
}).catch(onError);
|
|
242
|
+
} else {
|
|
243
|
+
onEvent(event);
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
onError: (error) => {
|
|
247
|
+
onError(error);
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
return unregisterCallbacks;
|
|
251
|
+
},
|
|
105
252
|
/**
|
|
106
253
|
* @public
|
|
107
254
|
* @category 인앱결제
|
|
108
|
-
* @name
|
|
255
|
+
* @name getProductItemList
|
|
109
256
|
* @description 인앱결제로 구매할 수 있는 상품 목록을 가져와요. 상품 목록 화면에 진입할 때 호출해요.
|
|
110
257
|
* @returns {Promise<{ products: IapProductListItem[] } | undefined>} 상품 목록을 포함한 객체를 반환해요. 앱 버전이 최소 지원 버전(안드로이드 5.219.0, iOS 5.219.0)보다 낮으면 `undefined`를 반환해요.
|
|
111
258
|
*/
|
|
@@ -113,15 +260,15 @@ var IAP = {
|
|
|
113
260
|
};
|
|
114
261
|
|
|
115
262
|
// src/getSafeAreaInsets.ts
|
|
116
|
-
import { createConstantBridge } from "@apps-in-toss/bridge-core";
|
|
117
|
-
var getSafeAreaBottom =
|
|
118
|
-
var getSafeAreaTop =
|
|
263
|
+
import { createConstantBridge as createConstantBridge2 } from "@apps-in-toss/bridge-core";
|
|
264
|
+
var getSafeAreaBottom = createConstantBridge2("getSafeAreaBottom");
|
|
265
|
+
var getSafeAreaTop = createConstantBridge2("getSafeAreaTop");
|
|
119
266
|
function getSafeAreaInsets() {
|
|
120
267
|
return { top: getSafeAreaTop(), bottom: getSafeAreaBottom() };
|
|
121
268
|
}
|
|
122
269
|
|
|
123
270
|
// src/googleAdMob.ts
|
|
124
|
-
import { createConstantBridge as
|
|
271
|
+
import { createConstantBridge as createConstantBridge3, createEventBridge as createEventBridge2 } from "@apps-in-toss/bridge-core";
|
|
125
272
|
var GoogleAdMob = {
|
|
126
273
|
/**
|
|
127
274
|
* @public
|
|
@@ -172,9 +319,9 @@ var GoogleAdMob = {
|
|
|
172
319
|
* ```
|
|
173
320
|
*/
|
|
174
321
|
loadAdMobInterstitialAd: Object.assign(
|
|
175
|
-
|
|
322
|
+
createEventBridge2("loadAdMobInterstitialAd"),
|
|
176
323
|
{
|
|
177
|
-
isSupported:
|
|
324
|
+
isSupported: createConstantBridge3("loadAdMobInterstitialAd_isSupported")
|
|
178
325
|
}
|
|
179
326
|
),
|
|
180
327
|
/**
|
|
@@ -247,9 +394,9 @@ var GoogleAdMob = {
|
|
|
247
394
|
* ```
|
|
248
395
|
*/
|
|
249
396
|
showAdMobInterstitialAd: Object.assign(
|
|
250
|
-
|
|
397
|
+
createEventBridge2("showAdMobInterstitialAd"),
|
|
251
398
|
{
|
|
252
|
-
isSupported:
|
|
399
|
+
isSupported: createConstantBridge3("showAdMobInterstitialAd_isSupported")
|
|
253
400
|
}
|
|
254
401
|
),
|
|
255
402
|
/**
|
|
@@ -301,9 +448,9 @@ var GoogleAdMob = {
|
|
|
301
448
|
* ```
|
|
302
449
|
*/
|
|
303
450
|
loadAdMobRewardedAd: Object.assign(
|
|
304
|
-
|
|
451
|
+
createEventBridge2("loadAdMobRewardedAd"),
|
|
305
452
|
{
|
|
306
|
-
isSupported:
|
|
453
|
+
isSupported: createConstantBridge3("loadAdMobRewardedAd_isSupported")
|
|
307
454
|
}
|
|
308
455
|
),
|
|
309
456
|
/**
|
|
@@ -376,9 +523,9 @@ var GoogleAdMob = {
|
|
|
376
523
|
* ```
|
|
377
524
|
*/
|
|
378
525
|
showAdMobRewardedAd: Object.assign(
|
|
379
|
-
|
|
526
|
+
createEventBridge2("showAdMobRewardedAd"),
|
|
380
527
|
{
|
|
381
|
-
isSupported:
|
|
528
|
+
isSupported: createConstantBridge3("showAdMobRewardedAd_isSupported")
|
|
382
529
|
}
|
|
383
530
|
),
|
|
384
531
|
/**
|
|
@@ -435,8 +582,8 @@ var GoogleAdMob = {
|
|
|
435
582
|
* }
|
|
436
583
|
* ```
|
|
437
584
|
*/
|
|
438
|
-
loadAppsInTossAdMob: Object.assign(
|
|
439
|
-
isSupported:
|
|
585
|
+
loadAppsInTossAdMob: Object.assign(createEventBridge2("loadAppsInTossAdMob"), {
|
|
586
|
+
isSupported: createConstantBridge3("loadAppsInTossAdMob_isSupported")
|
|
440
587
|
}),
|
|
441
588
|
/**
|
|
442
589
|
* @public
|
|
@@ -513,19 +660,19 @@ var GoogleAdMob = {
|
|
|
513
660
|
* }
|
|
514
661
|
* ```
|
|
515
662
|
*/
|
|
516
|
-
showAppsInTossAdMob: Object.assign(
|
|
517
|
-
isSupported:
|
|
663
|
+
showAppsInTossAdMob: Object.assign(createEventBridge2("showAppsInTossAdMob"), {
|
|
664
|
+
isSupported: createConstantBridge3("showAppsInTossAdMob_isSupported")
|
|
518
665
|
})
|
|
519
666
|
};
|
|
520
667
|
|
|
521
668
|
// src/graniteEvent.ts
|
|
522
|
-
import { createEventBridge as
|
|
669
|
+
import { createEventBridge as createEventBridge3 } from "@apps-in-toss/bridge-core";
|
|
523
670
|
var graniteEvent = {
|
|
524
671
|
addEventListener: (event, {
|
|
525
672
|
onEvent,
|
|
526
673
|
onError,
|
|
527
674
|
options
|
|
528
|
-
}) =>
|
|
675
|
+
}) => createEventBridge3(event)({
|
|
529
676
|
onEvent,
|
|
530
677
|
onError: onError ?? (() => {
|
|
531
678
|
}),
|
|
@@ -533,105 +680,14 @@ var graniteEvent = {
|
|
|
533
680
|
})
|
|
534
681
|
};
|
|
535
682
|
|
|
536
|
-
// src/isMinVersionSupported.ts
|
|
537
|
-
import { createConstantBridge as createConstantBridge3 } from "@apps-in-toss/bridge-core";
|
|
538
|
-
|
|
539
|
-
// src/utils/compareVersion.ts
|
|
540
|
-
var SEMVER_REGEX = /^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\\-]+(?:\.[\da-z\\-]+)*))?(?:\+[\da-z\\-]+(?:\.[\da-z\\-]+)*)?)?)?$/i;
|
|
541
|
-
var isWildcard = (val) => ["*", "x", "X"].includes(val);
|
|
542
|
-
var tryParse = (val) => {
|
|
543
|
-
const num = parseInt(val, 10);
|
|
544
|
-
return isNaN(num) ? val : num;
|
|
545
|
-
};
|
|
546
|
-
var coerceTypes = (a, b) => {
|
|
547
|
-
return typeof a === typeof b ? [a, b] : [String(a), String(b)];
|
|
548
|
-
};
|
|
549
|
-
var compareValues = (a, b) => {
|
|
550
|
-
if (isWildcard(a) || isWildcard(b)) {
|
|
551
|
-
return 0;
|
|
552
|
-
}
|
|
553
|
-
const [aVal, bVal] = coerceTypes(tryParse(a), tryParse(b));
|
|
554
|
-
if (aVal > bVal) {
|
|
555
|
-
return 1;
|
|
556
|
-
}
|
|
557
|
-
if (aVal < bVal) {
|
|
558
|
-
return -1;
|
|
559
|
-
}
|
|
560
|
-
return 0;
|
|
561
|
-
};
|
|
562
|
-
var parseVersion = (version) => {
|
|
563
|
-
if (typeof version !== "string") {
|
|
564
|
-
throw new TypeError("Invalid argument: expected a string");
|
|
565
|
-
}
|
|
566
|
-
const match = version.match(SEMVER_REGEX);
|
|
567
|
-
if (!match) {
|
|
568
|
-
throw new Error(`Invalid semver: '${version}'`);
|
|
569
|
-
}
|
|
570
|
-
const [, major, minor, patch, build, preRelease] = match;
|
|
571
|
-
return [major, minor, patch, build, preRelease];
|
|
572
|
-
};
|
|
573
|
-
var compareSegments = (a, b) => {
|
|
574
|
-
const maxLength = Math.max(a.length, b.length);
|
|
575
|
-
for (let i = 0; i < maxLength; i++) {
|
|
576
|
-
const segA = a[i] ?? "0";
|
|
577
|
-
const segB = b[i] ?? "0";
|
|
578
|
-
const result = compareValues(segA, segB);
|
|
579
|
-
if (result !== 0) {
|
|
580
|
-
return result;
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
|
-
return 0;
|
|
584
|
-
};
|
|
585
|
-
var compareVersions = (v1, v2) => {
|
|
586
|
-
const seg1 = parseVersion(v1);
|
|
587
|
-
const seg2 = parseVersion(v2);
|
|
588
|
-
const preRelease1 = seg1.pop();
|
|
589
|
-
const preRelease2 = seg2.pop();
|
|
590
|
-
const mainCompare = compareSegments(seg1, seg2);
|
|
591
|
-
if (mainCompare !== 0) {
|
|
592
|
-
return mainCompare;
|
|
593
|
-
}
|
|
594
|
-
if (preRelease1 && preRelease2) {
|
|
595
|
-
return compareSegments(preRelease1.split("."), preRelease2.split("."));
|
|
596
|
-
}
|
|
597
|
-
if (preRelease1) {
|
|
598
|
-
return -1;
|
|
599
|
-
}
|
|
600
|
-
if (preRelease2) {
|
|
601
|
-
return 1;
|
|
602
|
-
}
|
|
603
|
-
return 0;
|
|
604
|
-
};
|
|
605
|
-
|
|
606
|
-
// src/isMinVersionSupported.ts
|
|
607
|
-
function isMinVersionSupported(minVersions) {
|
|
608
|
-
const operationalEnvironment = createConstantBridge3("getOperationalEnvironment")();
|
|
609
|
-
if (operationalEnvironment === "sandbox") {
|
|
610
|
-
return true;
|
|
611
|
-
}
|
|
612
|
-
const currentVersion = createConstantBridge3("getTossAppVersion")();
|
|
613
|
-
const isIOS = createConstantBridge3("getPlatformOS")() === "ios";
|
|
614
|
-
const minVersion = isIOS ? minVersions.ios : minVersions.android;
|
|
615
|
-
if (minVersion === void 0) {
|
|
616
|
-
return false;
|
|
617
|
-
}
|
|
618
|
-
if (minVersion === "always") {
|
|
619
|
-
return true;
|
|
620
|
-
}
|
|
621
|
-
if (minVersion === "never") {
|
|
622
|
-
return false;
|
|
623
|
-
}
|
|
624
|
-
return compareVersions(currentVersion, minVersion) >= 0;
|
|
625
|
-
}
|
|
626
|
-
|
|
627
683
|
// src/appsInTossEvent.ts
|
|
628
|
-
import { createEventBridge as
|
|
684
|
+
import { createEventBridge as createEventBridge4 } from "@apps-in-toss/bridge-core";
|
|
629
685
|
var appsInTossEvent = {
|
|
630
686
|
addEventListener: (event, {
|
|
631
687
|
onEvent,
|
|
632
688
|
onError,
|
|
633
689
|
options
|
|
634
|
-
}) =>
|
|
690
|
+
}) => createEventBridge4(event)({
|
|
635
691
|
onEvent,
|
|
636
692
|
onError: onError ?? (() => {
|
|
637
693
|
}),
|
|
@@ -663,7 +719,7 @@ var getAppsInTossGlobals = () => {
|
|
|
663
719
|
};
|
|
664
720
|
|
|
665
721
|
// src/tdsEvent.ts
|
|
666
|
-
import { createEventBridge as
|
|
722
|
+
import { createEventBridge as createEventBridge5 } from "@apps-in-toss/bridge-core";
|
|
667
723
|
var tdsEvent = {
|
|
668
724
|
/**
|
|
669
725
|
* @public
|
|
@@ -693,7 +749,7 @@ var tdsEvent = {
|
|
|
693
749
|
onEvent,
|
|
694
750
|
onError,
|
|
695
751
|
options
|
|
696
|
-
}) =>
|
|
752
|
+
}) => createEventBridge5(event)({
|
|
697
753
|
onEvent,
|
|
698
754
|
onError: onError ?? (() => {
|
|
699
755
|
}),
|
|
@@ -858,14 +914,14 @@ var getClipboardText = createPermissionFunction({
|
|
|
858
914
|
});
|
|
859
915
|
|
|
860
916
|
// src/permissions/startUpdateLocation.ts
|
|
861
|
-
import { createAsyncBridge as createAsyncBridge11, createEventBridge as
|
|
917
|
+
import { createAsyncBridge as createAsyncBridge11, createEventBridge as createEventBridge6 } from "@apps-in-toss/bridge-core";
|
|
862
918
|
import {
|
|
863
919
|
StartUpdateLocationPermissionError
|
|
864
920
|
} from "@apps-in-toss/types";
|
|
865
921
|
var getPermission2 = createAsyncBridge11("getPermission");
|
|
866
922
|
var openPermissionDialog2 = createAsyncBridge11("openPermissionDialog");
|
|
867
923
|
var startUpdateLocation = (params) => {
|
|
868
|
-
return
|
|
924
|
+
return createEventBridge6("updateLocationEvent")({
|
|
869
925
|
...params,
|
|
870
926
|
onError: (error) => {
|
|
871
927
|
const locationError = new StartUpdateLocationPermissionError();
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@apps-in-toss/web-bridge",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.1.
|
|
4
|
+
"version": "1.1.3",
|
|
5
5
|
"description": "Web Bridge for Apps In Toss",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"prepack": "yarn build",
|
|
@@ -28,11 +28,11 @@
|
|
|
28
28
|
"built"
|
|
29
29
|
],
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@apps-in-toss/types": "1.1.
|
|
31
|
+
"@apps-in-toss/types": "1.1.3"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"@apps-in-toss/bridge-core": "1.1.
|
|
35
|
-
"@apps-in-toss/framework": "1.1.
|
|
34
|
+
"@apps-in-toss/bridge-core": "1.1.3",
|
|
35
|
+
"@apps-in-toss/framework": "1.1.3",
|
|
36
36
|
"@swc/core": "^1.12.7",
|
|
37
37
|
"picocolors": "^1.1.1",
|
|
38
38
|
"ts-morph": "^26.0.0",
|
|
@@ -46,5 +46,5 @@
|
|
|
46
46
|
"publishConfig": {
|
|
47
47
|
"access": "public"
|
|
48
48
|
},
|
|
49
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "0c80b4a0b49ec85f9f042909c7e9762c25425573"
|
|
50
50
|
}
|