@mathrunet/masamune 3.1.0 → 3.2.0
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/.claude/settings.local.json +9 -0
- package/CHANGELOG.md +18 -0
- package/dist/lib/functions/send_notification.d.ts +2 -1
- package/dist/lib/functions/send_notification.js +19 -7
- package/dist/lib/functions/send_notification.js.map +1 -1
- package/dist/lib/functions/verify_ios.d.ts +53 -6
- package/dist/lib/functions/verify_ios.js +113 -5
- package/dist/lib/functions/verify_ios.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
# [3.2.0](https://github.com/mathrunet/node_masamune/compare/v3.1.1...v3.2.0) (2025-08-19)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### feat
|
|
5
|
+
|
|
6
|
+
* Supports iOS StoreKit 2 validation. ([62450c5](https://github.com/mathrunet/node_masamune/commit/62450c566e33f97b0112bb55b1e3f34ea0d3a25e))
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
## [3.1.1](https://github.com/mathrunet/node_masamune/compare/v3.1.0...v3.1.1) (2025-08-14)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### fix
|
|
14
|
+
|
|
15
|
+
* Add a flag to `sendNotification` to control whether to display logs. ([87d31cb](https://github.com/mathrunet/node_masamune/commit/87d31cba2a06fbda27f235d8f59a5b7e2f35ad42))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
1
19
|
# [3.1.0](https://github.com/mathrunet/node_masamune/compare/v3.0.1...v3.1.0) (2025-07-24)
|
|
2
20
|
|
|
3
21
|
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
*
|
|
79
79
|
* デバッグ用にトークンリストを返すかどうかを指定します。
|
|
80
80
|
*/
|
|
81
|
-
export declare function sendNotification({ title, body, data, link, channelId, badgeCount, sound, targetToken, targetTopic, targetCollectionPath, targetDocumentPath, targetTokenField, targetWheres, targetConditions, responseTokenList, firestoreInstance, }: {
|
|
81
|
+
export declare function sendNotification({ title, body, data, link, channelId, badgeCount, sound, targetToken, targetTopic, targetCollectionPath, targetDocumentPath, targetTokenField, targetWheres, targetConditions, responseTokenList, firestoreInstance, showLog, }: {
|
|
82
82
|
title: string;
|
|
83
83
|
body: string;
|
|
84
84
|
link?: string | undefined | null;
|
|
@@ -103,6 +103,7 @@ export declare function sendNotification({ title, body, data, link, channelId, b
|
|
|
103
103
|
}[] | undefined;
|
|
104
104
|
responseTokenList?: boolean | undefined | null;
|
|
105
105
|
firestoreInstance: FirebaseFirestore.Firestore;
|
|
106
|
+
showLog?: boolean | undefined | null;
|
|
106
107
|
}): Promise<{
|
|
107
108
|
[key: string]: any;
|
|
108
109
|
}>;
|
|
@@ -128,7 +128,7 @@ const utils_1 = require("../utils");
|
|
|
128
128
|
* デバッグ用にトークンリストを返すかどうかを指定します。
|
|
129
129
|
*/
|
|
130
130
|
function sendNotification(_a) {
|
|
131
|
-
return __awaiter(this, arguments, void 0, function* ({ title, body, data, link, channelId, badgeCount, sound, targetToken, targetTopic, targetCollectionPath, targetDocumentPath, targetTokenField, targetWheres, targetConditions, responseTokenList, firestoreInstance, }) {
|
|
131
|
+
return __awaiter(this, arguments, void 0, function* ({ title, body, data, link, channelId, badgeCount, sound, targetToken, targetTopic, targetCollectionPath, targetDocumentPath, targetTokenField, targetWheres, targetConditions, responseTokenList, firestoreInstance, showLog, }) {
|
|
132
132
|
var _b, _c;
|
|
133
133
|
const res = {};
|
|
134
134
|
try {
|
|
@@ -141,7 +141,9 @@ function sendNotification(_a) {
|
|
|
141
141
|
}
|
|
142
142
|
// トークンによる通知
|
|
143
143
|
if (targetToken !== undefined && targetToken !== null) {
|
|
144
|
-
|
|
144
|
+
if (showLog) {
|
|
145
|
+
console.log(`Notification target token: ${targetToken}`);
|
|
146
|
+
}
|
|
145
147
|
if (typeof targetToken === "string") {
|
|
146
148
|
targetToken = [targetToken];
|
|
147
149
|
}
|
|
@@ -219,7 +221,9 @@ function sendNotification(_a) {
|
|
|
219
221
|
// トピックによる通知
|
|
220
222
|
}
|
|
221
223
|
else if (targetTopic !== undefined && targetTopic !== null) {
|
|
222
|
-
|
|
224
|
+
if (showLog) {
|
|
225
|
+
console.log(`Notification target topic: ${targetTopic}`);
|
|
226
|
+
}
|
|
223
227
|
if (responseTokenList) {
|
|
224
228
|
return {
|
|
225
229
|
success: true,
|
|
@@ -273,7 +277,9 @@ function sendNotification(_a) {
|
|
|
273
277
|
// コレクションパスによる通知
|
|
274
278
|
}
|
|
275
279
|
else if (targetCollectionPath !== undefined && targetCollectionPath !== null && targetTokenField != undefined && targetTokenField !== null) {
|
|
276
|
-
|
|
280
|
+
if (showLog) {
|
|
281
|
+
console.log(`Notification target collection path: ${targetCollectionPath} wheres: ${JSON.stringify(targetWheres)} conditions: ${JSON.stringify(targetConditions)}`);
|
|
282
|
+
}
|
|
277
283
|
const collectionRef = firestore.where({
|
|
278
284
|
query: firestoreInstance.collection(targetCollectionPath),
|
|
279
285
|
wheres: targetWheres,
|
|
@@ -286,7 +292,9 @@ function sendNotification(_a) {
|
|
|
286
292
|
collection = yield firestore.cursor({ query: collectionRef, limit: 500, cursor: cursor }).get();
|
|
287
293
|
for (let doc of collection.docs) {
|
|
288
294
|
const docData = doc.data();
|
|
289
|
-
|
|
295
|
+
if (showLog) {
|
|
296
|
+
console.log(`Document: ${JSON.stringify(docData)}`);
|
|
297
|
+
}
|
|
290
298
|
if (!(yield firestore.hasMatch({ data: docData, conditions: targetConditions }))) {
|
|
291
299
|
continue;
|
|
292
300
|
}
|
|
@@ -324,13 +332,17 @@ function sendNotification(_a) {
|
|
|
324
332
|
// ドキュメントパスによる通知
|
|
325
333
|
}
|
|
326
334
|
else if (targetDocumentPath !== undefined && targetDocumentPath !== null && targetTokenField != undefined && targetTokenField !== null) {
|
|
327
|
-
|
|
335
|
+
if (showLog) {
|
|
336
|
+
console.log(`Notification target document path: ${targetDocumentPath} conditions: ${JSON.stringify(targetConditions)}`);
|
|
337
|
+
}
|
|
328
338
|
const documentRef = firestoreInstance.doc(targetDocumentPath);
|
|
329
339
|
const results = [];
|
|
330
340
|
const doc = yield documentRef.get();
|
|
331
341
|
const docData = doc.data();
|
|
332
342
|
if (docData) {
|
|
333
|
-
|
|
343
|
+
if (showLog) {
|
|
344
|
+
console.log(`Document: ${JSON.stringify(docData)}`);
|
|
345
|
+
}
|
|
334
346
|
if (yield firestore.hasMatch({ data: docData, conditions: targetConditions })) {
|
|
335
347
|
const token = yield firestore.get({ data: docData, field: targetTokenField });
|
|
336
348
|
const tokens = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send_notification.js","sourceRoot":"","sources":["../../../src/lib/functions/send_notification.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqFA,
|
|
1
|
+
{"version":3,"file":"send_notification.js","sourceRoot":"","sources":["../../../src/lib/functions/send_notification.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqFA,4CA+RC;AApXD,iEAAmD;AACnD,sDAAwC;AACxC,uDAAyC;AACzC,oCAAsC;AAEtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+EG;AACH,SAAsB,gBAAgB;yDAAC,EACnC,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,UAAU,EACV,KAAK,EACL,WAAW,EACX,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,OAAO,GAmBV;;QACG,MAAM,GAAG,GAA2B,EAAE,CAAC;QACvC,IAAI,CAAC;YACD,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,IAAI,CAAC,IAAI,CAAC,oBAAoB,KAAK,SAAS,IAAI,oBAAoB,KAAK,IAAI,CAAC,IAAI,CAAC,kBAAkB,KAAK,SAAS,IAAI,kBAAkB,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC3P,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,kBAAkB,EAAE,4FAA4F,CAAC,CAAC;YAC3J,CAAC;YACD,kBAAkB;YAClB,IAAI,IAAI,EAAE,CAAC;gBACP,IAAI,mCACG,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,EAAE,KACb,OAAO,EAAE,IAAI,GAChB,CAAC;YACN,CAAC;YACD,YAAY;YACZ,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBACpD,IAAI,OAAO,EAAE,CAAC;oBACV,OAAO,CAAC,GAAG,CAAC,8BAA8B,WAAW,EAAE,CAAC,CAAC;gBAC7D,CAAC;gBACD,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;oBAClC,WAAW,GAAG,CAAC,WAAW,CAAC,CAAC;gBAChC,CAAC;gBACD,MAAM,SAAS,GAAG,IAAA,kBAAU,EAAC,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBAC7D,IAAI,iBAAiB,EAAE,CAAC;oBACpB,OAAO;wBACH,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,SAAS;qBACrB,CAAC;gBACN,CAAC;gBACD,KAAK,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;oBACtB,IAAI,CAAC;wBACD,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC,oBAAoB,CAC1D;4BACI,YAAY,EAAE;gCACV,KAAK,EAAE,KAAK;gCACZ,IAAI,EAAE,IAAI;6BACb;4BACD,OAAO,EAAE;gCACL,QAAQ,EAAE,MAAM;gCAChB,YAAY,EAAE;oCACV,KAAK,EAAE,KAAK;oCACZ,IAAI,EAAE,IAAI;oCACV,WAAW,EAAE,4BAA4B;oCACzC,SAAS,EAAE,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,SAAS;oCACjC,KAAK,EAAE,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,SAAS;iCAC5B;6BACJ;4BACD,IAAI,EAAE;gCACF,OAAO,EAAE;oCACL,GAAG,EAAE;wCACD,KAAK,EAAE,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,SAAS;wCACzB,KAAK,EAAE,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,SAAS;qCACjC;iCACJ;6BACJ;4BACD,IAAI,EAAE,IAAI;4BACV,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;yBACvB,CACJ,CAAC;wBACF,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;oBACvB,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACT,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBACf,OAAO,CAAC,GAAG,CAAC;4BACR,YAAY,EAAE;gCACV,KAAK,EAAE,KAAK;gCACZ,IAAI,EAAE,IAAI;6BACb;4BACD,OAAO,EAAE;gCACL,QAAQ,EAAE,MAAM;gCAChB,YAAY,EAAE;oCACV,KAAK,EAAE,KAAK;oCACZ,IAAI,EAAE,IAAI;oCACV,WAAW,EAAE,4BAA4B;oCACzC,SAAS,EAAE,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,SAAS;oCACjC,KAAK,EAAE,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,SAAS;iCAC5B;6BACJ;4BACD,IAAI,EAAE;gCACF,OAAO,EAAE;oCACL,GAAG,EAAE;wCACD,KAAK,EAAE,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,SAAS;wCACzB,KAAK,EAAE,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,SAAS;qCACjC;iCACJ;6BACJ;4BACD,IAAI,EAAE,IAAI;4BACV,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;yBACvB,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC;gBACD,OAAO;oBACH,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,GAAG;iBACf,CAAC;gBACF,YAAY;YAChB,CAAC;iBAAM,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBAC3D,IAAI,OAAO,EAAE,CAAC;oBACV,OAAO,CAAC,GAAG,CAAC,8BAA8B,WAAW,EAAE,CAAC,CAAC;gBAC7D,CAAC;gBACD,IAAI,iBAAiB,EAAE,CAAC;oBACpB,OAAO;wBACH,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,WAAW;qBACvB,CAAC;gBACN,CAAC;gBACD,IAAI,CAAC;oBACD,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC,IAAI,CAC1C;wBACI,YAAY,EAAE;4BACV,KAAK,EAAE,KAAK;4BACZ,IAAI,EAAE,IAAI;yBACb;wBACD,OAAO,EAAE;4BACL,QAAQ,EAAE,MAAM;4BAChB,YAAY,EAAE;gCACV,KAAK,EAAE,KAAK;gCACZ,IAAI,EAAE,IAAI;gCACV,WAAW,EAAE,4BAA4B;gCACzC,SAAS,EAAE,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,SAAS;6BACpC;yBACJ;wBACD,IAAI,EAAE,IAAI;wBACV,KAAK,EAAE,WAAW;qBACrB,CACJ,CAAC;oBACF,GAAG,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC;gBACjC,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACT,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC;wBACR,YAAY,EAAE;4BACV,KAAK,EAAE,KAAK;4BACZ,IAAI,EAAE,IAAI;yBACb;wBACD,OAAO,EAAE;4BACL,QAAQ,EAAE,MAAM;4BAChB,YAAY,EAAE;gCACV,KAAK,EAAE,KAAK;gCACZ,IAAI,EAAE,IAAI;gCACV,WAAW,EAAE,4BAA4B;gCACzC,SAAS,EAAE,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,SAAS;6BACpC;yBACJ;wBACD,IAAI,EAAE,IAAI;wBACV,KAAK,EAAE,WAAW;qBACrB,CAAC,CAAC;gBACP,CAAC;gBACD,OAAO;oBACH,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,GAAG;iBACf,CAAC;gBACF,gBAAgB;YACpB,CAAC;iBAAM,IAAI,oBAAoB,KAAK,SAAS,IAAI,oBAAoB,KAAK,IAAI,IAAI,gBAAgB,IAAI,SAAS,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;gBAC3I,IAAI,OAAO,EAAE,CAAC;oBACV,OAAO,CAAC,GAAG,CAAC,wCAAwC,oBAAoB,YAAY,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBACxK,CAAC;gBACD,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC;oBAClC,KAAK,EAAE,iBAAiB,CAAC,UAAU,CAAC,oBAAoB,CAAC;oBACzD,MAAM,EAAE,YAAY;iBACvB,CAAC,CAAC;gBACH,MAAM,OAAO,GAAU,EAAE,CAAC;gBAC1B,MAAM,MAAM,GAAa,EAAE,CAAC;gBAC5B,IAAI,MAAM,GAAmD,IAAI,CAAC;gBAClE,IAAI,UAAU,GAA2G,IAAI,CAAC;gBAC9H,GAAG,CAAC;oBACA,UAAU,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;oBAChG,KAAK,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;wBAC9B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;wBAC3B,IAAI,OAAO,EAAE,CAAC;4BACV,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;wBACxD,CAAC;wBACD,IAAI,CAAC,CAAA,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAA,EAAE,CAAC;4BAC7E,SAAS;wBACb,CAAC;wBACD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;wBAC9E,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;4BAC5B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBACvB,CAAC;6BAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;4BAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;wBAC1B,CAAC;oBACL,CAAC;oBACD,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC;wBAC/B,KAAK,EAAE,KAAK;wBACZ,IAAI,EAAE,IAAI;wBACV,IAAI,EAAE,IAAI;wBACV,SAAS,EAAE,SAAS;wBACpB,UAAU,EAAE,UAAU;wBACtB,KAAK,EAAE,KAAK;wBACZ,iBAAiB,EAAE,iBAAiB;wBACpC,WAAW,EAAE,MAAM;wBACnB,iBAAiB,EAAE,iBAAiB;qBACvC,CAAC,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,MAAA,GAAG,CAAC,OAAO,mCAAI,EAAE,CAAC,CAAC;oBAChC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;wBAC/B,MAAM;oBACV,CAAC;oBACD,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACzD,CAAC,QAAQ,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,EAAE;gBACxC,IAAI,iBAAiB,EAAE,CAAC;oBACpB,OAAO;wBACH,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,OAAO;qBACnB,CAAC;gBACN,CAAC;gBACD,gBAAgB;YACpB,CAAC;iBAAM,IAAI,kBAAkB,KAAK,SAAS,IAAI,kBAAkB,KAAK,IAAI,IAAI,gBAAgB,IAAI,SAAS,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;gBACvI,IAAI,OAAO,EAAE,CAAC;oBACV,OAAO,CAAC,GAAG,CAAC,sCAAsC,kBAAkB,gBAAgB,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAC5H,CAAC;gBACD,MAAM,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;gBAC9D,MAAM,OAAO,GAAU,EAAE,CAAC;gBAC1B,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC3B,IAAI,OAAO,EAAE,CAAC;oBACV,IAAI,OAAO,EAAE,CAAC;wBACV,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBACxD,CAAC;oBACD,IAAI,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC;wBAC5E,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;wBAC9E,MAAM,MAAM,GAAa,EAAE,CAAC;wBAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;4BAC5B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBACvB,CAAC;6BAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;4BAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;wBAC1B,CAAC;wBACD,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC;4BAC/B,KAAK,EAAE,KAAK;4BACZ,IAAI,EAAE,IAAI;4BACV,IAAI,EAAE,IAAI;4BACV,SAAS,EAAE,SAAS;4BACpB,UAAU,EAAE,UAAU;4BACtB,KAAK,EAAE,KAAK;4BACZ,iBAAiB,EAAE,iBAAiB;4BACpC,WAAW,EAAE,MAAM;4BACvB,iBAAiB,EAAE,iBAAiB;yBACnC,CAAC,CAAC;wBACH,OAAO,CAAC,IAAI,CAAC,MAAA,GAAG,CAAC,OAAO,mCAAI,EAAE,CAAC,CAAC;oBACpC,CAAC;gBACL,CAAC;gBACD,IAAI,iBAAiB,EAAE,CAAC;oBACpB,OAAO;wBACH,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,OAAO;qBACnB,CAAC;gBACN,CAAC;YACL,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,GAAG,CAAC;QACd,CAAC;QACD,OAAO;YACH,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,GAAG;SACf,CAAC;IACN,CAAC;CAAA"}
|
|
@@ -4,23 +4,70 @@
|
|
|
4
4
|
* IOSの受信確認を実行します。
|
|
5
5
|
*
|
|
6
6
|
* @param {String} receiptData
|
|
7
|
-
* Receipt data for purchases.
|
|
7
|
+
* Receipt data for purchases (for StoreKit1) or JWT token (for StoreKit2).
|
|
8
8
|
*
|
|
9
|
-
*
|
|
9
|
+
* 購入の際のレシートデータ(StoreKit1の場合)またはJWTトークン(StoreKit2の場合)。
|
|
10
10
|
*
|
|
11
11
|
* @param {String} password
|
|
12
|
-
* SharedSecret for AppStore, obtained from [Apps]->[App Info]->[Shared Secret for App] in the AppStore.
|
|
12
|
+
* SharedSecret for AppStore (for StoreKit1), obtained from [Apps]->[App Info]->[Shared Secret for App] in the AppStore.
|
|
13
|
+
* For StoreKit2, this can be an empty string.
|
|
13
14
|
*
|
|
14
|
-
* AppStoreのSharedSecret
|
|
15
|
+
* AppStoreのSharedSecret(StoreKit1の場合)。AppStoreの[アプリ]->[App情報]->[App用共有シークレット]から取得します。
|
|
16
|
+
* StoreKit2の場合は空文字列を渡すことができます。
|
|
17
|
+
*
|
|
18
|
+
* @param {Number} storeKitVersion
|
|
19
|
+
* StoreKit version (1 or 2). Defaults to 1.
|
|
20
|
+
*
|
|
21
|
+
* StoreKitのバージョン(1または2)。デフォルトは1。
|
|
22
|
+
*
|
|
23
|
+
* @param {String} transactionId
|
|
24
|
+
* Transaction ID (required for StoreKit2).
|
|
25
|
+
*
|
|
26
|
+
* トランザクションID(StoreKit2の場合は必須)。
|
|
15
27
|
*
|
|
16
28
|
* @return {Promise<{ [key: string]: any; }}
|
|
17
29
|
* Receipt information for the item.
|
|
18
30
|
*
|
|
19
31
|
* アイテムの受領情報。
|
|
20
32
|
*/
|
|
21
|
-
export declare function verifyIOS({ receiptData, password }: {
|
|
33
|
+
export declare function verifyIOS({ receiptData, password, storeKitVersion, transactionId }: {
|
|
22
34
|
receiptData: string;
|
|
23
|
-
password
|
|
35
|
+
password?: string | null | undefined;
|
|
36
|
+
storeKitVersion?: number;
|
|
37
|
+
transactionId?: string | null | undefined;
|
|
24
38
|
}): Promise<{
|
|
39
|
+
status: number;
|
|
40
|
+
environment: any;
|
|
41
|
+
receipt: {
|
|
42
|
+
bundle_id: any;
|
|
43
|
+
application_version: any;
|
|
44
|
+
in_app: {
|
|
45
|
+
quantity: any;
|
|
46
|
+
product_id: any;
|
|
47
|
+
transaction_id: any;
|
|
48
|
+
original_transaction_id: any;
|
|
49
|
+
purchase_date_ms: any;
|
|
50
|
+
original_purchase_date_ms: any;
|
|
51
|
+
expires_date_ms: any;
|
|
52
|
+
web_order_line_item_id: any;
|
|
53
|
+
is_trial_period: any;
|
|
54
|
+
is_in_intro_offer_period: any;
|
|
55
|
+
}[];
|
|
56
|
+
};
|
|
57
|
+
latest_receipt_info: {
|
|
58
|
+
quantity: any;
|
|
59
|
+
product_id: any;
|
|
60
|
+
transaction_id: any;
|
|
61
|
+
original_transaction_id: any;
|
|
62
|
+
purchase_date_ms: any;
|
|
63
|
+
original_purchase_date_ms: any;
|
|
64
|
+
expires_date_ms: any;
|
|
65
|
+
web_order_line_item_id: any;
|
|
66
|
+
is_trial_period: any;
|
|
67
|
+
is_in_intro_offer_period: any;
|
|
68
|
+
}[];
|
|
69
|
+
pending_renewal_info: never[];
|
|
70
|
+
decoded_payload: any;
|
|
71
|
+
} | {
|
|
25
72
|
[key: string]: any;
|
|
26
73
|
}>;
|
|
@@ -45,20 +45,33 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
45
45
|
exports.verifyIOS = verifyIOS;
|
|
46
46
|
const functions = __importStar(require("firebase-functions/v2"));
|
|
47
47
|
const api_1 = require("../api");
|
|
48
|
+
const jwt = __importStar(require("jsonwebtoken"));
|
|
48
49
|
/**
|
|
49
50
|
* Perform IOS receipt verification.
|
|
50
51
|
*
|
|
51
52
|
* IOSの受信確認を実行します。
|
|
52
53
|
*
|
|
53
54
|
* @param {String} receiptData
|
|
54
|
-
* Receipt data for purchases.
|
|
55
|
+
* Receipt data for purchases (for StoreKit1) or JWT token (for StoreKit2).
|
|
55
56
|
*
|
|
56
|
-
*
|
|
57
|
+
* 購入の際のレシートデータ(StoreKit1の場合)またはJWTトークン(StoreKit2の場合)。
|
|
57
58
|
*
|
|
58
59
|
* @param {String} password
|
|
59
|
-
* SharedSecret for AppStore, obtained from [Apps]->[App Info]->[Shared Secret for App] in the AppStore.
|
|
60
|
+
* SharedSecret for AppStore (for StoreKit1), obtained from [Apps]->[App Info]->[Shared Secret for App] in the AppStore.
|
|
61
|
+
* For StoreKit2, this can be an empty string.
|
|
60
62
|
*
|
|
61
|
-
* AppStoreのSharedSecret
|
|
63
|
+
* AppStoreのSharedSecret(StoreKit1の場合)。AppStoreの[アプリ]->[App情報]->[App用共有シークレット]から取得します。
|
|
64
|
+
* StoreKit2の場合は空文字列を渡すことができます。
|
|
65
|
+
*
|
|
66
|
+
* @param {Number} storeKitVersion
|
|
67
|
+
* StoreKit version (1 or 2). Defaults to 1.
|
|
68
|
+
*
|
|
69
|
+
* StoreKitのバージョン(1または2)。デフォルトは1。
|
|
70
|
+
*
|
|
71
|
+
* @param {String} transactionId
|
|
72
|
+
* Transaction ID (required for StoreKit2).
|
|
73
|
+
*
|
|
74
|
+
* トランザクションID(StoreKit2の場合は必須)。
|
|
62
75
|
*
|
|
63
76
|
* @return {Promise<{ [key: string]: any; }}
|
|
64
77
|
* Receipt information for the item.
|
|
@@ -66,7 +79,16 @@ const api_1 = require("../api");
|
|
|
66
79
|
* アイテムの受領情報。
|
|
67
80
|
*/
|
|
68
81
|
function verifyIOS(_a) {
|
|
69
|
-
return __awaiter(this, arguments, void 0, function* ({ receiptData, password }) {
|
|
82
|
+
return __awaiter(this, arguments, void 0, function* ({ receiptData, password, storeKitVersion = 1, transactionId }) {
|
|
83
|
+
if (storeKitVersion === 2) {
|
|
84
|
+
if (!transactionId) {
|
|
85
|
+
throw new functions.https.HttpsError("invalid-argument", "Transaction ID is required for StoreKit2 verification.");
|
|
86
|
+
}
|
|
87
|
+
return yield verifyIOSStoreKit2({ jwtToken: receiptData, transactionId });
|
|
88
|
+
}
|
|
89
|
+
if (!password) {
|
|
90
|
+
throw new functions.https.HttpsError("invalid-argument", "Password is required for StoreKit1 verification.");
|
|
91
|
+
}
|
|
70
92
|
let res = yield api_1.Api.post("https://buy.itunes.apple.com/verifyReceipt", {
|
|
71
93
|
timeout: 30 * 1000,
|
|
72
94
|
headers: {
|
|
@@ -116,4 +138,90 @@ function verifyIOS(_a) {
|
|
|
116
138
|
return json;
|
|
117
139
|
});
|
|
118
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* Verify iOS StoreKit2 transaction.
|
|
143
|
+
*
|
|
144
|
+
* iOS StoreKit2のトランザクションを検証します。
|
|
145
|
+
*
|
|
146
|
+
* @param {String} jwtToken
|
|
147
|
+
* JWT token from StoreKit2.
|
|
148
|
+
*
|
|
149
|
+
* StoreKit2からのJWTトークン。
|
|
150
|
+
*
|
|
151
|
+
*
|
|
152
|
+
* @return {Promise<{ [key: string]: any; }}
|
|
153
|
+
* Transaction information.
|
|
154
|
+
*
|
|
155
|
+
* トランザクション情報。
|
|
156
|
+
*/
|
|
157
|
+
function verifyIOSStoreKit2(_a) {
|
|
158
|
+
return __awaiter(this, arguments, void 0, function* ({ jwtToken, transactionId }) {
|
|
159
|
+
var _b, _c, _d, _e, _f, _g;
|
|
160
|
+
if (!jwtToken) {
|
|
161
|
+
throw new functions.https.HttpsError("invalid-argument", "JWT token is required for StoreKit2 verification.");
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
const decodedHeader = jwt.decode(jwtToken, { complete: true });
|
|
165
|
+
if (!decodedHeader) {
|
|
166
|
+
throw new functions.https.HttpsError("invalid-argument", "Invalid JWT token.");
|
|
167
|
+
}
|
|
168
|
+
const algorithm = decodedHeader.header.alg;
|
|
169
|
+
// const keyId = decodedHeader.header.kid; // May be used for future certificate validation
|
|
170
|
+
const x5c = decodedHeader.header.x5c;
|
|
171
|
+
if (!x5c || !Array.isArray(x5c) || x5c.length === 0) {
|
|
172
|
+
throw new functions.https.HttpsError("invalid-argument", "Missing x5c certificate chain in JWT header.");
|
|
173
|
+
}
|
|
174
|
+
const certificate = `-----BEGIN CERTIFICATE-----\n${x5c[0]}\n-----END CERTIFICATE-----`;
|
|
175
|
+
const verifiedPayload = jwt.verify(jwtToken, certificate, {
|
|
176
|
+
algorithms: [algorithm]
|
|
177
|
+
});
|
|
178
|
+
if (transactionId && verifiedPayload.transactionId !== transactionId) {
|
|
179
|
+
throw new functions.https.HttpsError("permission-denied", "Transaction ID mismatch.");
|
|
180
|
+
}
|
|
181
|
+
const result = {
|
|
182
|
+
status: 0,
|
|
183
|
+
environment: verifiedPayload.environment || "Production",
|
|
184
|
+
receipt: {
|
|
185
|
+
bundle_id: verifiedPayload.bundleId,
|
|
186
|
+
application_version: verifiedPayload.appVersion,
|
|
187
|
+
in_app: [{
|
|
188
|
+
quantity: verifiedPayload.quantity || "1",
|
|
189
|
+
product_id: verifiedPayload.productId,
|
|
190
|
+
transaction_id: verifiedPayload.transactionId,
|
|
191
|
+
original_transaction_id: verifiedPayload.originalTransactionId,
|
|
192
|
+
purchase_date_ms: (_b = verifiedPayload.purchaseDate) === null || _b === void 0 ? void 0 : _b.toString(),
|
|
193
|
+
original_purchase_date_ms: (_c = verifiedPayload.originalPurchaseDate) === null || _c === void 0 ? void 0 : _c.toString(),
|
|
194
|
+
expires_date_ms: (_d = verifiedPayload.expiresDate) === null || _d === void 0 ? void 0 : _d.toString(),
|
|
195
|
+
web_order_line_item_id: verifiedPayload.webOrderLineItemId,
|
|
196
|
+
is_trial_period: verifiedPayload.isTrialPeriod || "false",
|
|
197
|
+
is_in_intro_offer_period: verifiedPayload.isInIntroOfferPeriod || "false"
|
|
198
|
+
}]
|
|
199
|
+
},
|
|
200
|
+
latest_receipt_info: [{
|
|
201
|
+
quantity: verifiedPayload.quantity || "1",
|
|
202
|
+
product_id: verifiedPayload.productId,
|
|
203
|
+
transaction_id: verifiedPayload.transactionId,
|
|
204
|
+
original_transaction_id: verifiedPayload.originalTransactionId,
|
|
205
|
+
purchase_date_ms: (_e = verifiedPayload.purchaseDate) === null || _e === void 0 ? void 0 : _e.toString(),
|
|
206
|
+
original_purchase_date_ms: (_f = verifiedPayload.originalPurchaseDate) === null || _f === void 0 ? void 0 : _f.toString(),
|
|
207
|
+
expires_date_ms: (_g = verifiedPayload.expiresDate) === null || _g === void 0 ? void 0 : _g.toString(),
|
|
208
|
+
web_order_line_item_id: verifiedPayload.webOrderLineItemId,
|
|
209
|
+
is_trial_period: verifiedPayload.isTrialPeriod || "false",
|
|
210
|
+
is_in_intro_offer_period: verifiedPayload.isInIntroOfferPeriod || "false"
|
|
211
|
+
}],
|
|
212
|
+
pending_renewal_info: [],
|
|
213
|
+
decoded_payload: verifiedPayload
|
|
214
|
+
};
|
|
215
|
+
console.log("StoreKit2 verification successful:", result);
|
|
216
|
+
return result;
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
console.error("StoreKit2 verification error:", error);
|
|
220
|
+
if (error instanceof jwt.JsonWebTokenError) {
|
|
221
|
+
throw new functions.https.HttpsError("invalid-argument", "Invalid JWT token: " + error.message);
|
|
222
|
+
}
|
|
223
|
+
throw new functions.https.HttpsError("internal", "Failed to verify StoreKit2 transaction.");
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}
|
|
119
227
|
//# sourceMappingURL=verify_ios.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify_ios.js","sourceRoot":"","sources":["../../../src/lib/functions/verify_ios.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"verify_ios.js","sourceRoot":"","sources":["../../../src/lib/functions/verify_ios.ts"],"names":[],"mappings":"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"}
|