expo-iap 6.3.0 → 6.4.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/build/purchase-flow-confirmers.d.ts +2 -0
- package/build/purchase-flow-confirmers.d.ts.map +1 -1
- package/build/purchase-flow-confirmers.js +12 -3
- package/build/purchase-flow-confirmers.js.map +1 -1
- package/openiap-versions.json +3 -3
- package/osv-scanner.toml +5 -0
- package/package.json +1 -1
- package/src/purchase-flow-confirmers.ts +20 -3
|
@@ -13,6 +13,8 @@ export interface IapkitConfirmationOptions<P extends PurchaseFlowPurchase = Purc
|
|
|
13
13
|
amazon?: {
|
|
14
14
|
/** Verify App Tester receipts with the Amazon RVS Cloud Sandbox. */
|
|
15
15
|
sandbox?: boolean;
|
|
16
|
+
/** Expected verdict environment; defaults to Sandbox with sandbox, otherwise Production. */
|
|
17
|
+
expectedEnvironment?: "Sandbox" | "Production";
|
|
16
18
|
/** RVS reports a subscription term under its parent SKU; maps one to the other. */
|
|
17
19
|
verifiedProductId?: (productId: string) => string;
|
|
18
20
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"purchase-flow-confirmers.d.ts","sourceRoot":"","sources":["../src/purchase-flow-confirmers.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"purchase-flow-confirmers.d.ts","sourceRoot":"","sources":["../src/purchase-flow-confirmers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAE9B,KAAK,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE7D,yEAAyE;AACzE,MAAM,WAAW,yBAAyB,CACxC,CAAC,SAAS,oBAAoB,GAAG,oBAAoB;IAErD;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE;QACP,oEAAoE;QACpE,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,4FAA4F;QAC5F,mBAAmB,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;QAC/C,mFAAmF;QACnF,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;KACnD,CAAC;IACF,kGAAkG;IAClG,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,WAAW,GAAG,SAAS,CAAC;IACpD,gFAAgF;IAChF,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5E;AAED,+DAA+D;AAC/D,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE;QACN,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;QACxB,MAAM,CAAC,EAAE;YAAE,aAAa,EAAE,MAAM,CAAA;SAAE,CAAC;QACnC,MAAM,CAAC,EAAE;YACP,SAAS,EAAE,MAAM,CAAC;YAClB,iBAAiB,EAAE,MAAM,CAAC;YAC1B,OAAO,EAAE,OAAO,CAAC;YACjB,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,OAAO,CAAC,EAAE;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;KAC3B,CAAC;CACH;AAED,gEAAgE;AAChE,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,GAAG,IAAI,CAAC;IACT,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,IAAI,CAAC;CAC7D;AAID;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,oBAAoB,EACrE,0BAA0B,EAAE,CAC1B,KAAK,EAAE,uBAAuB,KAC3B,OAAO,CAAC,wBAAwB,CAAC,EACtC,OAAO,EAAE,yBAAyB,CAAC,CAAC,CAAC,GACpC,mBAAmB,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAgB9C;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,CAAC,SAAS,oBAAoB,EACxE,yBAAyB,EAAE,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,EAC7C,OAAO,GAAE;IACP,mEAAmE;IACnE,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE,GACL,mBAAmB,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAoC9C;AAgBD,oFAAoF;AACpF,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,oBAAoB,EACtE,QAAQ,EAAE,CAAC,EACX,OAAO,EAAE,yBAAyB,CAAC,CAAC,CAAC,GACpC,uBAAuB,CAmDzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,oBAAoB,EACnE,MAAM,EAAE,wBAAwB,EAChC,QAAQ,EAAE,CAAC,EACX,OAAO,EAAE;IAAE,YAAY,EAAE,OAAO,CAAA;CAAE,EAClC,OAAO,GAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAM,GACzD,oBAAoB,CAsDtB"}
|
|
@@ -86,6 +86,7 @@ export function toIapkitVerificationProps(purchase, options) {
|
|
|
86
86
|
iapkit: { ...base, google: { purchaseToken: token() } },
|
|
87
87
|
};
|
|
88
88
|
case "amazon":
|
|
89
|
+
amazonExpectedEnvironment(options.amazon);
|
|
89
90
|
return {
|
|
90
91
|
provider: "iapkit",
|
|
91
92
|
iapkit: {
|
|
@@ -169,11 +170,19 @@ function amazonProductId(purchase, options) {
|
|
|
169
170
|
return (options.amazon?.verifiedProductId?.(purchase.productId) ??
|
|
170
171
|
purchase.productId);
|
|
171
172
|
}
|
|
173
|
+
function amazonExpectedEnvironment(amazon) {
|
|
174
|
+
const expected = amazon?.expectedEnvironment ?? (amazon?.sandbox ? "Sandbox" : "Production");
|
|
175
|
+
if (expected !== "Sandbox" && expected !== "Production") {
|
|
176
|
+
throw new Error("Amazon expectedEnvironment must be Sandbox or Production");
|
|
177
|
+
}
|
|
178
|
+
if (amazon?.sandbox && expected === "Production") {
|
|
179
|
+
throw new Error("Amazon Cloud Sandbox requires expectedEnvironment Sandbox");
|
|
180
|
+
}
|
|
181
|
+
return expected;
|
|
182
|
+
}
|
|
172
183
|
function environmentMismatch(environment, store, purchase, options) {
|
|
173
184
|
const expected = store === "amazon"
|
|
174
|
-
? options.amazon
|
|
175
|
-
? "Sandbox"
|
|
176
|
-
: "Production"
|
|
185
|
+
? amazonExpectedEnvironment(options.amazon)
|
|
177
186
|
: store === "apple"
|
|
178
187
|
? purchase.environmentIOS
|
|
179
188
|
: null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"purchase-flow-confirmers.js","sourceRoot":"","sources":["../src/purchase-flow-confirmers.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal adapters for SDK confirmation helpers; apps use SDK root imports.\n// Each adapter uses the same lifecycle contract as other verification services.\nimport type {\n PurchaseConfirmation,\n PurchaseFlowOptions,\n PurchaseFlowPurchase,\n} from \"./purchase-flow-core\";\n\ntype IapkitStore = \"apple\" | \"google\" | \"amazon\" | \"horizon\";\n\n/** How an app without its own backend confirms purchases with IAPKit. */\nexport interface IapkitConfirmationOptions<\n P extends PurchaseFlowPurchase = PurchaseFlowPurchase,\n> {\n /**\n * A publishable key (`openiap-kit_pk_...`), which is safe to ship in an\n * app. Leave it out where the SDK has one configured, such as Expo's\n * `iapkitApiKey`.\n */\n apiKey?: string;\n /** A self-hosted or local IAPKit origin. Defaults to https://kit.openiap.dev. */\n baseUrl?: string;\n amazon?: {\n /** Verify App Tester receipts with the Amazon RVS Cloud Sandbox. */\n sandbox?: boolean;\n /** RVS reports a subscription term under its parent SKU; maps one to the other. */\n verifiedProductId?: (productId: string) => string;\n };\n /** The IAPKit store that verifies a community store's evidence, such as an Amazon RVS adapter. */\n verifyAs?: (purchase: P) => IapkitStore | undefined;\n /** Credits consumables before finishing; must be idempotent per purchase.id. */\n grant?: (purchase: P, context: { isConsumable: boolean }) => Promise<void>;\n}\n\n/** @internal Use the SDK's VerifyPurchaseWithProviderProps. */\nexport interface IapkitVerificationProps {\n provider: \"iapkit\";\n iapkit: {\n apiKey?: string;\n baseUrl?: string;\n apple?: { jws: string };\n google?: { purchaseToken: string };\n amazon?: {\n receiptId: string;\n expectedProductId: string;\n sandbox: boolean;\n userId?: string;\n };\n horizon?: { sku: string };\n };\n}\n\n/** @internal Use the SDK's VerifyPurchaseWithProviderResult. */\nexport interface IapkitVerificationResult {\n iapkit?: {\n store: string;\n storeId: string;\n environment?: string | null;\n isValid: boolean;\n state: string;\n productId?: string | null;\n } | null;\n errors?: { code?: string | null; message: string }[] | null;\n}\n\nconst IAPKIT_UNKNOWN_RETRY_MS = 30_000;\n\n/**\n * @internal Use the SDK's confirmWithIapkit.\n * The SDK's `confirmWithIapkit`, given its `verifyPurchaseWithProvider`:\n * verifies the purchase with IAPKit, then runs `grant` before the flow\n * finishes it.\n */\nexport function createIapkitConfirmation<P extends PurchaseFlowPurchase>(\n verifyPurchaseWithProvider: (\n props: IapkitVerificationProps,\n ) => Promise<IapkitVerificationResult>,\n options: IapkitConfirmationOptions<P>,\n): PurchaseFlowOptions<P>[\"confirmWithBackend\"] {\n return async (purchase, context) => {\n requireGrant(\"confirmWithIapkit\", purchase, context, options);\n const confirmation = readIapkitVerification(\n await verifyPurchaseWithProvider(\n toIapkitVerificationProps(purchase, options),\n ),\n purchase,\n context,\n options,\n );\n if (confirmation.status === \"entitled\" && !confirmation.alreadyGranted) {\n await options.grant?.(purchase, context);\n }\n return confirmation;\n };\n}\n\n/**\n * @internal Use the SDK's confirmOnDeviceIOS.\n * The SDK's `confirmOnDeviceIOS`, given its `getPendingTransactionsIOS`, for an\n * app with neither a backend nor IAPKit. StoreKit verified the transaction if\n * it is still unfinished, unrevoked, not upgraded, unexpired, and from the\n * purchase's environment; `grant` then runs before the flow finishes it.\n */\nexport function createDeviceConfirmationIOS<P extends PurchaseFlowPurchase>(\n getPendingTransactionsIOS: () => Promise<P[]>,\n options: {\n /** Required for consumables; credit each purchase.id only once. */\n grant?: (purchase: P, context: { isConsumable: boolean }) => Promise<void>;\n } = {},\n): PurchaseFlowOptions<P>[\"confirmWithBackend\"] {\n return async (purchase, context) => {\n requireGrant(\"confirmOnDeviceIOS\", purchase, context, options);\n // A community provider may report store \"apple\" under its own storeId.\n if (\n purchase.store !== \"apple\" ||\n (purchase.storeId ?? \"apple\") !== \"apple\"\n ) {\n throw new Error(\n `Device confirmation covers App Store purchases, not ${purchase.storeId ?? purchase.store}`,\n );\n }\n const pending = await getPendingTransactionsIOS();\n // After the query: a transaction can expire while StoreKit answers.\n const now = Date.now();\n const verified = pending.some(\n (candidate) =>\n candidate.store === \"apple\" &&\n purchase.id !== \"\" &&\n candidate.id === purchase.id &&\n candidate.productId === purchase.productId &&\n candidate.revocationDateIOS == null &&\n candidate.isUpgradedIOS !== true &&\n (candidate.expirationDateIOS == null ||\n candidate.expirationDateIOS > now) &&\n (purchase.environmentIOS == null ||\n candidate.environmentIOS === purchase.environmentIOS),\n );\n if (!verified) {\n throw new Error(\n `StoreKit lists no valid unfinished transaction for ${purchase.productId}`,\n );\n }\n await options.grant?.(purchase, context);\n return { status: \"entitled\", alreadyGranted: false };\n };\n}\n\n// Checked before verifying: a consumable must never pass without a way to credit it.\nfunction requireGrant<P extends PurchaseFlowPurchase>(\n name: string,\n purchase: P,\n context: { isConsumable: boolean },\n options: Pick<IapkitConfirmationOptions<P>, \"grant\">,\n): void {\n if (context.isConsumable && !options.grant) {\n throw new Error(\n `${name} needs grant to credit consumable ${purchase.productId} before it is consumed`,\n );\n }\n}\n\n/** @internal Builds the IAPKit request; throws for a store IAPKit cannot verify. */\nexport function toIapkitVerificationProps<P extends PurchaseFlowPurchase>(\n purchase: P,\n options: IapkitConfirmationOptions<P>,\n): IapkitVerificationProps {\n const apiKey = options.apiKey?.trim();\n // An unset environment variable, not a deliberate fallback to the SDK's key.\n if (apiKey === \"\") throw new Error(\"IAPKit apiKey is empty\");\n const baseUrl = options.baseUrl?.trim();\n const base = {\n ...(apiKey ? { apiKey } : {}),\n ...(baseUrl ? { baseUrl } : {}),\n };\n const token = (): string => {\n if (!purchase.purchaseToken) {\n throw new Error(\n `Purchase ${purchase.productId} has no purchase token to verify`,\n );\n }\n return purchase.purchaseToken;\n };\n const store = verifyingStore(purchase, options);\n switch (store) {\n case \"apple\":\n return {\n provider: \"iapkit\",\n iapkit: { ...base, apple: { jws: token() } },\n };\n case \"google\":\n return {\n provider: \"iapkit\",\n iapkit: { ...base, google: { purchaseToken: token() } },\n };\n case \"amazon\":\n return {\n provider: \"iapkit\",\n iapkit: {\n ...base,\n amazon: {\n receiptId: token(),\n expectedProductId: amazonProductId(purchase, options),\n sandbox: options.amazon?.sandbox ?? false,\n ...(purchase.userIdAmazon ? { userId: purchase.userIdAmazon } : {}),\n },\n },\n };\n case \"horizon\":\n return {\n provider: \"iapkit\",\n iapkit: { ...base, horizon: { sku: purchase.productId } },\n };\n default:\n throw new Error(`IAPKit cannot verify store ${purchase.store}`);\n }\n}\n\n/**\n * @internal Use the SDK's confirmWithIapkit.\n * Turns IAPKit's answer into the flow's confirmation. Anything that may be a\n * configuration error rather than a rejected payment throws, so the flow\n * reports `failed` and leaves the purchase unfinished: evidence for another\n * store, product, or environment, `inauthentic` (IAPKit's answer to a product\n * or package mismatch, and to every Horizon rejection), and a valid state this\n * product type cannot be granted from.\n */\nexport function readIapkitVerification<P extends PurchaseFlowPurchase>(\n result: IapkitVerificationResult,\n purchase: P,\n context: { isConsumable: boolean },\n options: Omit<IapkitConfirmationOptions<P>, \"apiKey\"> = {},\n): PurchaseConfirmation {\n const verified = result.iapkit;\n if (!verified) {\n const errors = (result.errors ?? []).map((error) =>\n error.code ? `[${error.code}] ${error.message}` : error.message,\n );\n throw new Error(\n errors.join(\"\\n\") || \"IAPKit returned no verification result\",\n );\n }\n switch (verified.state) {\n case \"pending\":\n return { status: \"store_pending\" };\n // The store gave no usable answer: retry instead of rejecting a payment.\n case \"unknown\":\n return {\n status: \"verification_delayed\",\n retryAfterMs: IAPKIT_UNKNOWN_RETRY_MS,\n };\n }\n const store = verifyingStore(purchase, options);\n const expectedProductId =\n store === \"amazon\"\n ? amazonProductId(purchase, options)\n : purchase.productId;\n const mismatch =\n verified.store !== purchase.store\n ? `store ${verified.store}, expected ${purchase.store}`\n : purchase.storeId && verified.storeId !== purchase.storeId\n ? `store id ${verified.storeId}, expected ${purchase.storeId}`\n : verified.productId !== expectedProductId\n ? `product ${verified.productId ?? \"(none)\"}, expected ${expectedProductId}`\n : environmentMismatch(verified.environment, store, purchase, options);\n if (mismatch) throw new Error(`IAPKit verified ${mismatch}`);\n if (!verified.isValid) {\n switch (verified.state) {\n case \"canceled\":\n case \"expired\":\n return { status: \"invalid\", reason: verified.state };\n // Only a granted purchase is consumed; the flow grants before finishing.\n case \"consumed\":\n return { status: \"entitled\", alreadyGranted: true };\n default:\n throw new Error(`IAPKit rejected the purchase: ${verified.state}`);\n }\n }\n if (!grantsAccess(store, verified.state, context.isConsumable)) {\n throw new Error(\n `IAPKit state ${verified.state} cannot grant this ${\n context.isConsumable ? \"consumable\" : \"non-consumable\"\n } ${purchase.store} purchase`,\n );\n }\n return { status: \"entitled\", alreadyGranted: false };\n}\n\nfunction verifyingStore<P extends PurchaseFlowPurchase>(\n purchase: P,\n options: Pick<IapkitConfirmationOptions<P>, \"verifyAs\">,\n): string {\n return options.verifyAs?.(purchase) ?? purchase.store;\n}\n\nfunction amazonProductId(\n purchase: PurchaseFlowPurchase,\n options: Pick<IapkitConfirmationOptions, \"amazon\">,\n): string {\n return (\n options.amazon?.verifiedProductId?.(purchase.productId) ??\n purchase.productId\n );\n}\n\nfunction environmentMismatch(\n environment: string | null | undefined,\n store: string,\n purchase: PurchaseFlowPurchase,\n options: Pick<IapkitConfirmationOptions, \"amazon\">,\n): string | null {\n const expected =\n store === \"amazon\"\n ? options.amazon?.sandbox\n ? \"Sandbox\"\n : \"Production\"\n : store === \"apple\"\n ? purchase.environmentIOS\n : null;\n return expected && environment !== expected\n ? `environment ${environment ?? \"(none)\"}, expected ${expected}`\n : null;\n}\n\n// Apple and Amazon keep a consumable at ready-to-consume until it is finished;\n// Google reports a granted purchase as pending-acknowledgment until then.\nfunction grantsAccess(\n store: string,\n state: string,\n isConsumable: boolean,\n): boolean {\n switch (store) {\n case \"apple\":\n case \"amazon\":\n return state === (isConsumable ? \"ready-to-consume\" : \"entitled\");\n case \"google\":\n return (\n state === \"entitled\" ||\n state === \"pending-acknowledgment\" ||\n (isConsumable && state === \"ready-to-consume\")\n );\n case \"horizon\":\n return state === \"entitled\";\n default:\n return false;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"purchase-flow-confirmers.js","sourceRoot":"","sources":["../src/purchase-flow-confirmers.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal adapters for SDK confirmation helpers; apps use SDK root imports.\n// Each adapter uses the same lifecycle contract as other verification services.\nimport type {\n PurchaseConfirmation,\n PurchaseFlowOptions,\n PurchaseFlowPurchase,\n} from \"./purchase-flow-core\";\n\ntype IapkitStore = \"apple\" | \"google\" | \"amazon\" | \"horizon\";\n\n/** How an app without its own backend confirms purchases with IAPKit. */\nexport interface IapkitConfirmationOptions<\n P extends PurchaseFlowPurchase = PurchaseFlowPurchase,\n> {\n /**\n * A publishable key (`openiap-kit_pk_...`), which is safe to ship in an\n * app. Leave it out where the SDK has one configured, such as Expo's\n * `iapkitApiKey`.\n */\n apiKey?: string;\n /** A self-hosted or local IAPKit origin. Defaults to https://kit.openiap.dev. */\n baseUrl?: string;\n amazon?: {\n /** Verify App Tester receipts with the Amazon RVS Cloud Sandbox. */\n sandbox?: boolean;\n /** Expected verdict environment; defaults to Sandbox with sandbox, otherwise Production. */\n expectedEnvironment?: \"Sandbox\" | \"Production\";\n /** RVS reports a subscription term under its parent SKU; maps one to the other. */\n verifiedProductId?: (productId: string) => string;\n };\n /** The IAPKit store that verifies a community store's evidence, such as an Amazon RVS adapter. */\n verifyAs?: (purchase: P) => IapkitStore | undefined;\n /** Credits consumables before finishing; must be idempotent per purchase.id. */\n grant?: (purchase: P, context: { isConsumable: boolean }) => Promise<void>;\n}\n\n/** @internal Use the SDK's VerifyPurchaseWithProviderProps. */\nexport interface IapkitVerificationProps {\n provider: \"iapkit\";\n iapkit: {\n apiKey?: string;\n baseUrl?: string;\n apple?: { jws: string };\n google?: { purchaseToken: string };\n amazon?: {\n receiptId: string;\n expectedProductId: string;\n sandbox: boolean;\n userId?: string;\n };\n horizon?: { sku: string };\n };\n}\n\n/** @internal Use the SDK's VerifyPurchaseWithProviderResult. */\nexport interface IapkitVerificationResult {\n iapkit?: {\n store: string;\n storeId: string;\n environment?: string | null;\n isValid: boolean;\n state: string;\n productId?: string | null;\n } | null;\n errors?: { code?: string | null; message: string }[] | null;\n}\n\nconst IAPKIT_UNKNOWN_RETRY_MS = 30_000;\n\n/**\n * @internal Use the SDK's confirmWithIapkit.\n * The SDK's `confirmWithIapkit`, given its `verifyPurchaseWithProvider`:\n * verifies the purchase with IAPKit, then runs `grant` before the flow\n * finishes it.\n */\nexport function createIapkitConfirmation<P extends PurchaseFlowPurchase>(\n verifyPurchaseWithProvider: (\n props: IapkitVerificationProps,\n ) => Promise<IapkitVerificationResult>,\n options: IapkitConfirmationOptions<P>,\n): PurchaseFlowOptions<P>[\"confirmWithBackend\"] {\n return async (purchase, context) => {\n requireGrant(\"confirmWithIapkit\", purchase, context, options);\n const confirmation = readIapkitVerification(\n await verifyPurchaseWithProvider(\n toIapkitVerificationProps(purchase, options),\n ),\n purchase,\n context,\n options,\n );\n if (confirmation.status === \"entitled\" && !confirmation.alreadyGranted) {\n await options.grant?.(purchase, context);\n }\n return confirmation;\n };\n}\n\n/**\n * @internal Use the SDK's confirmOnDeviceIOS.\n * The SDK's `confirmOnDeviceIOS`, given its `getPendingTransactionsIOS`, for an\n * app with neither a backend nor IAPKit. StoreKit verified the transaction if\n * it is still unfinished, unrevoked, not upgraded, unexpired, and from the\n * purchase's environment; `grant` then runs before the flow finishes it.\n */\nexport function createDeviceConfirmationIOS<P extends PurchaseFlowPurchase>(\n getPendingTransactionsIOS: () => Promise<P[]>,\n options: {\n /** Required for consumables; credit each purchase.id only once. */\n grant?: (purchase: P, context: { isConsumable: boolean }) => Promise<void>;\n } = {},\n): PurchaseFlowOptions<P>[\"confirmWithBackend\"] {\n return async (purchase, context) => {\n requireGrant(\"confirmOnDeviceIOS\", purchase, context, options);\n // A community provider may report store \"apple\" under its own storeId.\n if (\n purchase.store !== \"apple\" ||\n (purchase.storeId ?? \"apple\") !== \"apple\"\n ) {\n throw new Error(\n `Device confirmation covers App Store purchases, not ${purchase.storeId ?? purchase.store}`,\n );\n }\n const pending = await getPendingTransactionsIOS();\n // After the query: a transaction can expire while StoreKit answers.\n const now = Date.now();\n const verified = pending.some(\n (candidate) =>\n candidate.store === \"apple\" &&\n purchase.id !== \"\" &&\n candidate.id === purchase.id &&\n candidate.productId === purchase.productId &&\n candidate.revocationDateIOS == null &&\n candidate.isUpgradedIOS !== true &&\n (candidate.expirationDateIOS == null ||\n candidate.expirationDateIOS > now) &&\n (purchase.environmentIOS == null ||\n candidate.environmentIOS === purchase.environmentIOS),\n );\n if (!verified) {\n throw new Error(\n `StoreKit lists no valid unfinished transaction for ${purchase.productId}`,\n );\n }\n await options.grant?.(purchase, context);\n return { status: \"entitled\", alreadyGranted: false };\n };\n}\n\n// Checked before verifying: a consumable must never pass without a way to credit it.\nfunction requireGrant<P extends PurchaseFlowPurchase>(\n name: string,\n purchase: P,\n context: { isConsumable: boolean },\n options: Pick<IapkitConfirmationOptions<P>, \"grant\">,\n): void {\n if (context.isConsumable && !options.grant) {\n throw new Error(\n `${name} needs grant to credit consumable ${purchase.productId} before it is consumed`,\n );\n }\n}\n\n/** @internal Builds the IAPKit request; throws for a store IAPKit cannot verify. */\nexport function toIapkitVerificationProps<P extends PurchaseFlowPurchase>(\n purchase: P,\n options: IapkitConfirmationOptions<P>,\n): IapkitVerificationProps {\n const apiKey = options.apiKey?.trim();\n // An unset environment variable, not a deliberate fallback to the SDK's key.\n if (apiKey === \"\") throw new Error(\"IAPKit apiKey is empty\");\n const baseUrl = options.baseUrl?.trim();\n const base = {\n ...(apiKey ? { apiKey } : {}),\n ...(baseUrl ? { baseUrl } : {}),\n };\n const token = (): string => {\n if (!purchase.purchaseToken) {\n throw new Error(\n `Purchase ${purchase.productId} has no purchase token to verify`,\n );\n }\n return purchase.purchaseToken;\n };\n const store = verifyingStore(purchase, options);\n switch (store) {\n case \"apple\":\n return {\n provider: \"iapkit\",\n iapkit: { ...base, apple: { jws: token() } },\n };\n case \"google\":\n return {\n provider: \"iapkit\",\n iapkit: { ...base, google: { purchaseToken: token() } },\n };\n case \"amazon\":\n amazonExpectedEnvironment(options.amazon);\n return {\n provider: \"iapkit\",\n iapkit: {\n ...base,\n amazon: {\n receiptId: token(),\n expectedProductId: amazonProductId(purchase, options),\n sandbox: options.amazon?.sandbox ?? false,\n ...(purchase.userIdAmazon ? { userId: purchase.userIdAmazon } : {}),\n },\n },\n };\n case \"horizon\":\n return {\n provider: \"iapkit\",\n iapkit: { ...base, horizon: { sku: purchase.productId } },\n };\n default:\n throw new Error(`IAPKit cannot verify store ${purchase.store}`);\n }\n}\n\n/**\n * @internal Use the SDK's confirmWithIapkit.\n * Turns IAPKit's answer into the flow's confirmation. Anything that may be a\n * configuration error rather than a rejected payment throws, so the flow\n * reports `failed` and leaves the purchase unfinished: evidence for another\n * store, product, or environment, `inauthentic` (IAPKit's answer to a product\n * or package mismatch, and to every Horizon rejection), and a valid state this\n * product type cannot be granted from.\n */\nexport function readIapkitVerification<P extends PurchaseFlowPurchase>(\n result: IapkitVerificationResult,\n purchase: P,\n context: { isConsumable: boolean },\n options: Omit<IapkitConfirmationOptions<P>, \"apiKey\"> = {},\n): PurchaseConfirmation {\n const verified = result.iapkit;\n if (!verified) {\n const errors = (result.errors ?? []).map((error) =>\n error.code ? `[${error.code}] ${error.message}` : error.message,\n );\n throw new Error(\n errors.join(\"\\n\") || \"IAPKit returned no verification result\",\n );\n }\n switch (verified.state) {\n case \"pending\":\n return { status: \"store_pending\" };\n // The store gave no usable answer: retry instead of rejecting a payment.\n case \"unknown\":\n return {\n status: \"verification_delayed\",\n retryAfterMs: IAPKIT_UNKNOWN_RETRY_MS,\n };\n }\n const store = verifyingStore(purchase, options);\n const expectedProductId =\n store === \"amazon\"\n ? amazonProductId(purchase, options)\n : purchase.productId;\n const mismatch =\n verified.store !== purchase.store\n ? `store ${verified.store}, expected ${purchase.store}`\n : purchase.storeId && verified.storeId !== purchase.storeId\n ? `store id ${verified.storeId}, expected ${purchase.storeId}`\n : verified.productId !== expectedProductId\n ? `product ${verified.productId ?? \"(none)\"}, expected ${expectedProductId}`\n : environmentMismatch(verified.environment, store, purchase, options);\n if (mismatch) throw new Error(`IAPKit verified ${mismatch}`);\n if (!verified.isValid) {\n switch (verified.state) {\n case \"canceled\":\n case \"expired\":\n return { status: \"invalid\", reason: verified.state };\n // Only a granted purchase is consumed; the flow grants before finishing.\n case \"consumed\":\n return { status: \"entitled\", alreadyGranted: true };\n default:\n throw new Error(`IAPKit rejected the purchase: ${verified.state}`);\n }\n }\n if (!grantsAccess(store, verified.state, context.isConsumable)) {\n throw new Error(\n `IAPKit state ${verified.state} cannot grant this ${\n context.isConsumable ? \"consumable\" : \"non-consumable\"\n } ${purchase.store} purchase`,\n );\n }\n return { status: \"entitled\", alreadyGranted: false };\n}\n\nfunction verifyingStore<P extends PurchaseFlowPurchase>(\n purchase: P,\n options: Pick<IapkitConfirmationOptions<P>, \"verifyAs\">,\n): string {\n return options.verifyAs?.(purchase) ?? purchase.store;\n}\n\nfunction amazonProductId(\n purchase: PurchaseFlowPurchase,\n options: Pick<IapkitConfirmationOptions, \"amazon\">,\n): string {\n return (\n options.amazon?.verifiedProductId?.(purchase.productId) ??\n purchase.productId\n );\n}\n\nfunction amazonExpectedEnvironment(\n amazon: IapkitConfirmationOptions[\"amazon\"],\n): \"Sandbox\" | \"Production\" {\n const expected =\n amazon?.expectedEnvironment ?? (amazon?.sandbox ? \"Sandbox\" : \"Production\");\n if (expected !== \"Sandbox\" && expected !== \"Production\") {\n throw new Error(\"Amazon expectedEnvironment must be Sandbox or Production\");\n }\n if (amazon?.sandbox && expected === \"Production\") {\n throw new Error(\n \"Amazon Cloud Sandbox requires expectedEnvironment Sandbox\",\n );\n }\n return expected;\n}\n\nfunction environmentMismatch(\n environment: string | null | undefined,\n store: string,\n purchase: PurchaseFlowPurchase,\n options: Pick<IapkitConfirmationOptions, \"amazon\">,\n): string | null {\n const expected =\n store === \"amazon\"\n ? amazonExpectedEnvironment(options.amazon)\n : store === \"apple\"\n ? purchase.environmentIOS\n : null;\n return expected && environment !== expected\n ? `environment ${environment ?? \"(none)\"}, expected ${expected}`\n : null;\n}\n\n// Apple and Amazon keep a consumable at ready-to-consume until it is finished;\n// Google reports a granted purchase as pending-acknowledgment until then.\nfunction grantsAccess(\n store: string,\n state: string,\n isConsumable: boolean,\n): boolean {\n switch (store) {\n case \"apple\":\n case \"amazon\":\n return state === (isConsumable ? \"ready-to-consume\" : \"entitled\");\n case \"google\":\n return (\n state === \"entitled\" ||\n state === \"pending-acknowledgment\" ||\n (isConsumable && state === \"ready-to-consume\")\n );\n case \"horizon\":\n return state === \"entitled\";\n default:\n return false;\n }\n}\n"]}
|
package/openiap-versions.json
CHANGED
package/osv-scanner.toml
CHANGED
|
@@ -2,3 +2,8 @@
|
|
|
2
2
|
id = "GHSA-86w9-cpqp-85rv"
|
|
3
3
|
ignoreUntil = 2026-12-15
|
|
4
4
|
reason = "No patched node-forge release exists; 1.4.0 is npm latest and still affected. Reached only via @expo/cli and @expo/code-signing-certificates for development certificate tooling; the published SDK and config plugin do not import it. Development certificate verification remains affected: https://github.com/advisories/GHSA-86w9-cpqp-85rv."
|
|
5
|
+
|
|
6
|
+
[[IgnoredVulns]]
|
|
7
|
+
id = "GHSA-gcqx-w48m-w2h4"
|
|
8
|
+
ignoreUntil = 2026-11-04
|
|
9
|
+
reason = "No patched deepmerge release exists. This lock reaches it only through Jest, Expo configuration, or React Native/Kepler CLI configuration used for trusted local builds and tests; mobile entry points and the published SDK runtime do not import those tools. Do not load untrusted project configuration. Revisit the upstream fix before expiry: https://github.com/advisories/GHSA-gcqx-w48m-w2h4."
|
package/package.json
CHANGED
|
@@ -23,6 +23,8 @@ export interface IapkitConfirmationOptions<
|
|
|
23
23
|
amazon?: {
|
|
24
24
|
/** Verify App Tester receipts with the Amazon RVS Cloud Sandbox. */
|
|
25
25
|
sandbox?: boolean;
|
|
26
|
+
/** Expected verdict environment; defaults to Sandbox with sandbox, otherwise Production. */
|
|
27
|
+
expectedEnvironment?: "Sandbox" | "Production";
|
|
26
28
|
/** RVS reports a subscription term under its parent SKU; maps one to the other. */
|
|
27
29
|
verifiedProductId?: (productId: string) => string;
|
|
28
30
|
};
|
|
@@ -193,6 +195,7 @@ export function toIapkitVerificationProps<P extends PurchaseFlowPurchase>(
|
|
|
193
195
|
iapkit: { ...base, google: { purchaseToken: token() } },
|
|
194
196
|
};
|
|
195
197
|
case "amazon":
|
|
198
|
+
amazonExpectedEnvironment(options.amazon);
|
|
196
199
|
return {
|
|
197
200
|
provider: "iapkit",
|
|
198
201
|
iapkit: {
|
|
@@ -302,6 +305,22 @@ function amazonProductId(
|
|
|
302
305
|
);
|
|
303
306
|
}
|
|
304
307
|
|
|
308
|
+
function amazonExpectedEnvironment(
|
|
309
|
+
amazon: IapkitConfirmationOptions["amazon"],
|
|
310
|
+
): "Sandbox" | "Production" {
|
|
311
|
+
const expected =
|
|
312
|
+
amazon?.expectedEnvironment ?? (amazon?.sandbox ? "Sandbox" : "Production");
|
|
313
|
+
if (expected !== "Sandbox" && expected !== "Production") {
|
|
314
|
+
throw new Error("Amazon expectedEnvironment must be Sandbox or Production");
|
|
315
|
+
}
|
|
316
|
+
if (amazon?.sandbox && expected === "Production") {
|
|
317
|
+
throw new Error(
|
|
318
|
+
"Amazon Cloud Sandbox requires expectedEnvironment Sandbox",
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
return expected;
|
|
322
|
+
}
|
|
323
|
+
|
|
305
324
|
function environmentMismatch(
|
|
306
325
|
environment: string | null | undefined,
|
|
307
326
|
store: string,
|
|
@@ -310,9 +329,7 @@ function environmentMismatch(
|
|
|
310
329
|
): string | null {
|
|
311
330
|
const expected =
|
|
312
331
|
store === "amazon"
|
|
313
|
-
? options.amazon
|
|
314
|
-
? "Sandbox"
|
|
315
|
-
: "Production"
|
|
332
|
+
? amazonExpectedEnvironment(options.amazon)
|
|
316
333
|
: store === "apple"
|
|
317
334
|
? purchase.environmentIOS
|
|
318
335
|
: null;
|