Closer/functions/dist/billing/syncEntitlement.js

35 lines
1.4 KiB
JavaScript
Raw Permalink Normal View History

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.syncEntitlement = void 0;
refactor(functions): B3 migrate 12 callables to v2 + harden Migrate all callables off functions.https.onCall to firebase-functions/v2/https onCall: createInvite, acceptInvite, leaveCouple, submitOutcome, sendGentleReminder, sendThinkingOfYou, checkDeviceIntegrity, syncEntitlement, assignDailyQuestionCallable, wrapReleaseKey. context.auth/app → request.auth/app, data arg → request.data. The 8 client-hardcoded callable names are preserved verbatim (verified via emulator discovery). The manual `if (!request.app)` App Check check is a 1:1 port (no enforceAppCheck switch). Hardening folded in: - acceptInviteCallable: await the previously fire-and-forget partner_joined push (gen 2 freezes the instance after the response) — still swallows push errors so a failed push never fails the accept. - checkDeviceIntegrity: 10s timeout on the Play Integrity client.request so a hung upstream can't pin the instance (fail-closed catch already handles the throw); memory 512MiB. - wrapReleaseKey: memory 512MiB (tink); HttpsError swapped to v2; lazy tink require + graceful failure preserved. - Error mapping with `if (e instanceof HttpsError) throw e` re-throw guard around the risky DB sections in acceptInvite, leaveCouple, submitOutcome, sendGentleReminder, sendThinkingOfYou — raw errors map to a clean 'internal' without masking intentional codes (resource-exhausted rate limits, permission-denied, etc.). leaveCouple's best-effort recursiveDelete sweep now swallows errors (the transactional leave already succeeded). - Adopt shared sendPushToUser()/logger; remove copied token readers + plaintext token logging. Delete dead placeholder callables notifications/reminders.ts (sendDailyQuestionReminder, sendPartnerAnsweredNotification) — no client caller; wrote sent:false rows nothing consumed. Build clean; 70 tests green; discovery loads all callables as v2 in us-central1. dist rebuilt. Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-07-07 23:58:32 -05:00
const https_1 = require("firebase-functions/v2/https");
const entitlementLogic_1 = require("./entitlementLogic");
refactor(functions): B3 migrate 12 callables to v2 + harden Migrate all callables off functions.https.onCall to firebase-functions/v2/https onCall: createInvite, acceptInvite, leaveCouple, submitOutcome, sendGentleReminder, sendThinkingOfYou, checkDeviceIntegrity, syncEntitlement, assignDailyQuestionCallable, wrapReleaseKey. context.auth/app → request.auth/app, data arg → request.data. The 8 client-hardcoded callable names are preserved verbatim (verified via emulator discovery). The manual `if (!request.app)` App Check check is a 1:1 port (no enforceAppCheck switch). Hardening folded in: - acceptInviteCallable: await the previously fire-and-forget partner_joined push (gen 2 freezes the instance after the response) — still swallows push errors so a failed push never fails the accept. - checkDeviceIntegrity: 10s timeout on the Play Integrity client.request so a hung upstream can't pin the instance (fail-closed catch already handles the throw); memory 512MiB. - wrapReleaseKey: memory 512MiB (tink); HttpsError swapped to v2; lazy tink require + graceful failure preserved. - Error mapping with `if (e instanceof HttpsError) throw e` re-throw guard around the risky DB sections in acceptInvite, leaveCouple, submitOutcome, sendGentleReminder, sendThinkingOfYou — raw errors map to a clean 'internal' without masking intentional codes (resource-exhausted rate limits, permission-denied, etc.). leaveCouple's best-effort recursiveDelete sweep now swallows errors (the transactional leave already succeeded). - Adopt shared sendPushToUser()/logger; remove copied token readers + plaintext token logging. Delete dead placeholder callables notifications/reminders.ts (sendDailyQuestionReminder, sendPartnerAnsweredNotification) — no client caller; wrote sent:false rows nothing consumed. Build clean; 70 tests green; discovery loads all callables as v2 in us-central1. dist rebuilt. Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-07-07 23:58:32 -05:00
const log_1 = require("../log");
/**
* Callable function that forces a re-sync of entitlements for the
* authenticated caller.
*
* Request body: { } (auth context supplies uid)
* Response: EntitlementState
*
* The client can invoke this after a purchase/restore or when local
* entitlement state appears stale. In production this should fetch the
* latest entitlement state from RevenueCat; for now it computes the
* state from the existing Firestore document and rewrites it, ensuring
* consistent field shapes.
*/
refactor(functions): B3 migrate 12 callables to v2 + harden Migrate all callables off functions.https.onCall to firebase-functions/v2/https onCall: createInvite, acceptInvite, leaveCouple, submitOutcome, sendGentleReminder, sendThinkingOfYou, checkDeviceIntegrity, syncEntitlement, assignDailyQuestionCallable, wrapReleaseKey. context.auth/app → request.auth/app, data arg → request.data. The 8 client-hardcoded callable names are preserved verbatim (verified via emulator discovery). The manual `if (!request.app)` App Check check is a 1:1 port (no enforceAppCheck switch). Hardening folded in: - acceptInviteCallable: await the previously fire-and-forget partner_joined push (gen 2 freezes the instance after the response) — still swallows push errors so a failed push never fails the accept. - checkDeviceIntegrity: 10s timeout on the Play Integrity client.request so a hung upstream can't pin the instance (fail-closed catch already handles the throw); memory 512MiB. - wrapReleaseKey: memory 512MiB (tink); HttpsError swapped to v2; lazy tink require + graceful failure preserved. - Error mapping with `if (e instanceof HttpsError) throw e` re-throw guard around the risky DB sections in acceptInvite, leaveCouple, submitOutcome, sendGentleReminder, sendThinkingOfYou — raw errors map to a clean 'internal' without masking intentional codes (resource-exhausted rate limits, permission-denied, etc.). leaveCouple's best-effort recursiveDelete sweep now swallows errors (the transactional leave already succeeded). - Adopt shared sendPushToUser()/logger; remove copied token readers + plaintext token logging. Delete dead placeholder callables notifications/reminders.ts (sendDailyQuestionReminder, sendPartnerAnsweredNotification) — no client caller; wrote sent:false rows nothing consumed. Build clean; 70 tests green; discovery loads all callables as v2 in us-central1. dist rebuilt. Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-07-07 23:58:32 -05:00
exports.syncEntitlement = (0, https_1.onCall)(async (request) => {
var _a;
refactor(functions): B3 migrate 12 callables to v2 + harden Migrate all callables off functions.https.onCall to firebase-functions/v2/https onCall: createInvite, acceptInvite, leaveCouple, submitOutcome, sendGentleReminder, sendThinkingOfYou, checkDeviceIntegrity, syncEntitlement, assignDailyQuestionCallable, wrapReleaseKey. context.auth/app → request.auth/app, data arg → request.data. The 8 client-hardcoded callable names are preserved verbatim (verified via emulator discovery). The manual `if (!request.app)` App Check check is a 1:1 port (no enforceAppCheck switch). Hardening folded in: - acceptInviteCallable: await the previously fire-and-forget partner_joined push (gen 2 freezes the instance after the response) — still swallows push errors so a failed push never fails the accept. - checkDeviceIntegrity: 10s timeout on the Play Integrity client.request so a hung upstream can't pin the instance (fail-closed catch already handles the throw); memory 512MiB. - wrapReleaseKey: memory 512MiB (tink); HttpsError swapped to v2; lazy tink require + graceful failure preserved. - Error mapping with `if (e instanceof HttpsError) throw e` re-throw guard around the risky DB sections in acceptInvite, leaveCouple, submitOutcome, sendGentleReminder, sendThinkingOfYou — raw errors map to a clean 'internal' without masking intentional codes (resource-exhausted rate limits, permission-denied, etc.). leaveCouple's best-effort recursiveDelete sweep now swallows errors (the transactional leave already succeeded). - Adopt shared sendPushToUser()/logger; remove copied token readers + plaintext token logging. Delete dead placeholder callables notifications/reminders.ts (sendDailyQuestionReminder, sendPartnerAnsweredNotification) — no client caller; wrote sent:false rows nothing consumed. Build clean; 70 tests green; discovery loads all callables as v2 in us-central1. dist rebuilt. Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-07-07 23:58:32 -05:00
if (!((_a = request.auth) === null || _a === void 0 ? void 0 : _a.uid)) {
throw new https_1.HttpsError('unauthenticated', 'Caller must be authenticated.');
}
refactor(functions): B3 migrate 12 callables to v2 + harden Migrate all callables off functions.https.onCall to firebase-functions/v2/https onCall: createInvite, acceptInvite, leaveCouple, submitOutcome, sendGentleReminder, sendThinkingOfYou, checkDeviceIntegrity, syncEntitlement, assignDailyQuestionCallable, wrapReleaseKey. context.auth/app → request.auth/app, data arg → request.data. The 8 client-hardcoded callable names are preserved verbatim (verified via emulator discovery). The manual `if (!request.app)` App Check check is a 1:1 port (no enforceAppCheck switch). Hardening folded in: - acceptInviteCallable: await the previously fire-and-forget partner_joined push (gen 2 freezes the instance after the response) — still swallows push errors so a failed push never fails the accept. - checkDeviceIntegrity: 10s timeout on the Play Integrity client.request so a hung upstream can't pin the instance (fail-closed catch already handles the throw); memory 512MiB. - wrapReleaseKey: memory 512MiB (tink); HttpsError swapped to v2; lazy tink require + graceful failure preserved. - Error mapping with `if (e instanceof HttpsError) throw e` re-throw guard around the risky DB sections in acceptInvite, leaveCouple, submitOutcome, sendGentleReminder, sendThinkingOfYou — raw errors map to a clean 'internal' without masking intentional codes (resource-exhausted rate limits, permission-denied, etc.). leaveCouple's best-effort recursiveDelete sweep now swallows errors (the transactional leave already succeeded). - Adopt shared sendPushToUser()/logger; remove copied token readers + plaintext token logging. Delete dead placeholder callables notifications/reminders.ts (sendDailyQuestionReminder, sendPartnerAnsweredNotification) — no client caller; wrote sent:false rows nothing consumed. Build clean; 70 tests green; discovery loads all callables as v2 in us-central1. dist rebuilt. Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-07-07 23:58:32 -05:00
const userId = request.auth.uid;
try {
const state = await (0, entitlementLogic_1.applyEntitlementSync)(userId);
return state;
}
catch (err) {
refactor(functions): B3 migrate 12 callables to v2 + harden Migrate all callables off functions.https.onCall to firebase-functions/v2/https onCall: createInvite, acceptInvite, leaveCouple, submitOutcome, sendGentleReminder, sendThinkingOfYou, checkDeviceIntegrity, syncEntitlement, assignDailyQuestionCallable, wrapReleaseKey. context.auth/app → request.auth/app, data arg → request.data. The 8 client-hardcoded callable names are preserved verbatim (verified via emulator discovery). The manual `if (!request.app)` App Check check is a 1:1 port (no enforceAppCheck switch). Hardening folded in: - acceptInviteCallable: await the previously fire-and-forget partner_joined push (gen 2 freezes the instance after the response) — still swallows push errors so a failed push never fails the accept. - checkDeviceIntegrity: 10s timeout on the Play Integrity client.request so a hung upstream can't pin the instance (fail-closed catch already handles the throw); memory 512MiB. - wrapReleaseKey: memory 512MiB (tink); HttpsError swapped to v2; lazy tink require + graceful failure preserved. - Error mapping with `if (e instanceof HttpsError) throw e` re-throw guard around the risky DB sections in acceptInvite, leaveCouple, submitOutcome, sendGentleReminder, sendThinkingOfYou — raw errors map to a clean 'internal' without masking intentional codes (resource-exhausted rate limits, permission-denied, etc.). leaveCouple's best-effort recursiveDelete sweep now swallows errors (the transactional leave already succeeded). - Adopt shared sendPushToUser()/logger; remove copied token readers + plaintext token logging. Delete dead placeholder callables notifications/reminders.ts (sendDailyQuestionReminder, sendPartnerAnsweredNotification) — no client caller; wrote sent:false rows nothing consumed. Build clean; 70 tests green; discovery loads all callables as v2 in us-central1. dist rebuilt. Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-07-07 23:58:32 -05:00
log_1.logger.error('[syncEntitlement] failed', { error: String(err) });
throw new https_1.HttpsError('internal', 'Entitlement sync failed.');
}
});
//# sourceMappingURL=syncEntitlement.js.map