@onesub/server 0.14.0 → 0.16.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/dist/__tests__/google-subscriptions-v2.test.d.ts +1 -1
- package/dist/__tests__/receipt-age.test.d.ts +7 -0
- package/dist/__tests__/receipt-age.test.d.ts.map +1 -0
- package/dist/__tests__/tracing.test.d.ts +2 -0
- package/dist/__tests__/tracing.test.d.ts.map +1 -0
- package/dist/cache.d.ts +5 -0
- package/dist/cache.d.ts.map +1 -1
- package/dist/index.cjs +178 -55
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +178 -55
- package/dist/index.js.map +1 -1
- package/dist/providers/apple.d.ts.map +1 -1
- package/dist/providers/google.d.ts.map +1 -1
- package/dist/providers/mock.d.ts.map +1 -1
- package/dist/routes/admin.d.ts.map +1 -1
- package/dist/routes/purchase.d.ts.map +1 -1
- package/dist/routes/validate.d.ts.map +1 -1
- package/dist/routes/webhook-apple.d.ts.map +1 -1
- package/dist/routes/webhook-google.d.ts +1 -1
- package/dist/routes/webhook-google.d.ts.map +1 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/stores/postgres.d.ts.map +1 -1
- package/dist/stores/redis.d.ts +1 -0
- package/dist/stores/redis.d.ts.map +1 -1
- package/dist/tracing.d.ts.map +1 -1
- package/dist/webhook-events.d.ts +10 -0
- package/dist/webhook-events.d.ts.map +1 -1
- package/package.json +5 -3
- package/dist/__tests__/admin-customer-detail.test.js +0 -146
- package/dist/__tests__/admin-customer-detail.test.js.map +0 -1
- package/dist/__tests__/admin-list-subscriptions.test.js +0 -192
- package/dist/__tests__/admin-list-subscriptions.test.js.map +0 -1
- package/dist/__tests__/admin-subscription-detail.test.js +0 -112
- package/dist/__tests__/admin-subscription-detail.test.js.map +0 -1
- package/dist/__tests__/apple-root-ca.test.js +0 -41
- package/dist/__tests__/apple-root-ca.test.js.map +0 -1
- package/dist/__tests__/apple-status-api.test.js +0 -345
- package/dist/__tests__/apple-status-api.test.js.map +0 -1
- package/dist/__tests__/cache.test.js +0 -34
- package/dist/__tests__/cache.test.js.map +0 -1
- package/dist/__tests__/entitlements.test.js +0 -268
- package/dist/__tests__/entitlements.test.js.map +0 -1
- package/dist/__tests__/error-codes.test.js +0 -173
- package/dist/__tests__/error-codes.test.js.map +0 -1
- package/dist/__tests__/fetch-hardening.test.js +0 -192
- package/dist/__tests__/fetch-hardening.test.js.map +0 -1
- package/dist/__tests__/google-paused.test.js +0 -126
- package/dist/__tests__/google-paused.test.js.map +0 -1
- package/dist/__tests__/google-price-change.test.js +0 -186
- package/dist/__tests__/google-price-change.test.js.map +0 -1
- package/dist/__tests__/google-subscriptions-v2.test.js +0 -206
- package/dist/__tests__/google-subscriptions-v2.test.js.map +0 -1
- package/dist/__tests__/lifecycle-scenarios.test.js +0 -579
- package/dist/__tests__/lifecycle-scenarios.test.js.map +0 -1
- package/dist/__tests__/lifecycle-states.test.js +0 -423
- package/dist/__tests__/lifecycle-states.test.js.map +0 -1
- package/dist/__tests__/linked-purchase-token.test.js +0 -227
- package/dist/__tests__/linked-purchase-token.test.js.map +0 -1
- package/dist/__tests__/metrics.test.js +0 -340
- package/dist/__tests__/metrics.test.js.map +0 -1
- package/dist/__tests__/mock-provider.test.js +0 -188
- package/dist/__tests__/mock-provider.test.js.map +0 -1
- package/dist/__tests__/openapi.test.js +0 -32
- package/dist/__tests__/openapi.test.js.map +0 -1
- package/dist/__tests__/paused-auto-resume.test.js +0 -162
- package/dist/__tests__/paused-auto-resume.test.js.map +0 -1
- package/dist/__tests__/providers.test.js +0 -321
- package/dist/__tests__/providers.test.js.map +0 -1
- package/dist/__tests__/redis-store.test.js +0 -166
- package/dist/__tests__/redis-store.test.js.map +0 -1
- package/dist/__tests__/refund-policy.test.js +0 -317
- package/dist/__tests__/refund-policy.test.js.map +0 -1
- package/dist/__tests__/schema.test.js +0 -46
- package/dist/__tests__/schema.test.js.map +0 -1
- package/dist/__tests__/store.test.js +0 -172
- package/dist/__tests__/store.test.js.map +0 -1
- package/dist/__tests__/test-utils.js +0 -30
- package/dist/__tests__/test-utils.js.map +0 -1
- package/dist/__tests__/webhook-apple.test.js +0 -247
- package/dist/__tests__/webhook-apple.test.js.map +0 -1
- package/dist/__tests__/webhook-events.test.js +0 -36
- package/dist/__tests__/webhook-events.test.js.map +0 -1
- package/dist/__tests__/webhook-google.test.js +0 -255
- package/dist/__tests__/webhook-google.test.js.map +0 -1
- package/dist/__tests__/webhook-queue.test.js +0 -26
- package/dist/__tests__/webhook-queue.test.js.map +0 -1
- package/dist/__tests__/webhook-refund.test.js +0 -313
- package/dist/__tests__/webhook-refund.test.js.map +0 -1
- package/dist/cache.js +0 -39
- package/dist/cache.js.map +0 -1
- package/dist/errors.js +0 -19
- package/dist/errors.js.map +0 -1
- package/dist/http.js +0 -36
- package/dist/http.js.map +0 -1
- package/dist/logger.js +0 -20
- package/dist/logger.js.map +0 -1
- package/dist/openapi.js +0 -196
- package/dist/openapi.js.map +0 -1
- package/dist/providers/apple-root-ca.js +0 -38
- package/dist/providers/apple-root-ca.js.map +0 -1
- package/dist/providers/apple.js +0 -630
- package/dist/providers/apple.js.map +0 -1
- package/dist/providers/google.js +0 -564
- package/dist/providers/google.js.map +0 -1
- package/dist/providers/mock.js +0 -93
- package/dist/providers/mock.js.map +0 -1
- package/dist/routes/admin.js +0 -327
- package/dist/routes/admin.js.map +0 -1
- package/dist/routes/apple-offer.js +0 -72
- package/dist/routes/apple-offer.js.map +0 -1
- package/dist/routes/entitlements.js +0 -130
- package/dist/routes/entitlements.js.map +0 -1
- package/dist/routes/metrics.js +0 -281
- package/dist/routes/metrics.js.map +0 -1
- package/dist/routes/purchase.js +0 -204
- package/dist/routes/purchase.js.map +0 -1
- package/dist/routes/status.js +0 -55
- package/dist/routes/status.js.map +0 -1
- package/dist/routes/validate.js +0 -70
- package/dist/routes/validate.js.map +0 -1
- package/dist/routes/webhook-apple.js +0 -145
- package/dist/routes/webhook-apple.js.map +0 -1
- package/dist/routes/webhook-google.js +0 -204
- package/dist/routes/webhook-google.js.map +0 -1
- package/dist/routes/webhook.js +0 -19
- package/dist/routes/webhook.js.map +0 -1
- package/dist/store.js +0 -145
- package/dist/store.js.map +0 -1
- package/dist/stores/postgres.js +0 -329
- package/dist/stores/postgres.js.map +0 -1
- package/dist/stores/redis.js +0 -297
- package/dist/stores/redis.js.map +0 -1
- package/dist/stores/schema.js +0 -67
- package/dist/stores/schema.js.map +0 -1
- package/dist/tracing.js +0 -74
- package/dist/tracing.js.map +0 -1
- package/dist/webhook-events.js +0 -58
- package/dist/webhook-events.js.map +0 -1
- package/dist/webhook-queue.js +0 -108
- package/dist/webhook-queue.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"apple.js","sourceRoot":"","sources":["../../src/providers/apple.ts"],"names":[],"mappings":"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"}
|
package/dist/providers/google.js
DELETED
|
@@ -1,564 +0,0 @@
|
|
|
1
|
-
import { SUBSCRIPTION_STATUS } from '@onesub/shared';
|
|
2
|
-
import { log } from '../logger.js';
|
|
3
|
-
import { fetchWithTimeout } from '../http.js';
|
|
4
|
-
import { getDefaultCache } from '../cache.js';
|
|
5
|
-
import { mockValidateGoogleSubscription, mockValidateGoogleProduct, } from './mock.js';
|
|
6
|
-
/**
|
|
7
|
-
* Google RTDN notification types.
|
|
8
|
-
* https://developer.android.com/google/play/billing/rtdn-reference
|
|
9
|
-
*/
|
|
10
|
-
const GOOGLE_NOTIFICATION_TYPE = {
|
|
11
|
-
SUBSCRIPTION_RECOVERED: 1,
|
|
12
|
-
SUBSCRIPTION_RENEWED: 2,
|
|
13
|
-
SUBSCRIPTION_CANCELED: 3,
|
|
14
|
-
SUBSCRIPTION_PURCHASED: 4,
|
|
15
|
-
SUBSCRIPTION_ON_HOLD: 5,
|
|
16
|
-
SUBSCRIPTION_IN_GRACE_PERIOD: 6,
|
|
17
|
-
SUBSCRIPTION_RESTARTED: 7,
|
|
18
|
-
SUBSCRIPTION_PRICE_CHANGE_CONFIRMED: 8,
|
|
19
|
-
SUBSCRIPTION_DEFERRED: 9,
|
|
20
|
-
SUBSCRIPTION_PAUSED: 10,
|
|
21
|
-
SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED: 11,
|
|
22
|
-
SUBSCRIPTION_REVOKED: 12,
|
|
23
|
-
SUBSCRIPTION_EXPIRED: 13,
|
|
24
|
-
};
|
|
25
|
-
/** Maximum age for product receipts (72 hours). */
|
|
26
|
-
const MAX_PRODUCT_RECEIPT_AGE_MS = 72 * 60 * 60 * 1000;
|
|
27
|
-
/**
|
|
28
|
-
* Per-key in-flight token mint promises. Used to deduplicate concurrent
|
|
29
|
-
* refreshes inside a single process — the cluster-wide cache layer sits in
|
|
30
|
-
* `getDefaultCache()` underneath. Without this map every concurrent caller in
|
|
31
|
-
* the same process would fire a separate network refresh while waiting for
|
|
32
|
-
* the new value to land in Redis / memory.
|
|
33
|
-
*/
|
|
34
|
-
const refreshPromises = new Map();
|
|
35
|
-
/**
|
|
36
|
-
* Build the cache key for a given service account.
|
|
37
|
-
*
|
|
38
|
-
* Hashing the key (instead of using it raw) keeps the key length bounded for
|
|
39
|
-
* cache backends that have key-size limits, and avoids leaking partial JSON
|
|
40
|
-
* into log lines that print cache keys.
|
|
41
|
-
*/
|
|
42
|
-
function googleTokenCacheKey(serviceAccountKey) {
|
|
43
|
-
let hash = 0;
|
|
44
|
-
for (let i = 0; i < serviceAccountKey.length; i++) {
|
|
45
|
-
hash = (hash * 31 + serviceAccountKey.charCodeAt(i)) | 0;
|
|
46
|
-
}
|
|
47
|
-
return `google:oauth:${hash}`;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Obtain a Google OAuth2 access token, returning a cached token if it has more
|
|
51
|
-
* than 60 seconds of remaining validity. Google tokens are valid for 3600 seconds,
|
|
52
|
-
* so this avoids a network round-trip on every API call.
|
|
53
|
-
*
|
|
54
|
-
* Cache layer: `getDefaultCache()` (in-memory by default, swappable with
|
|
55
|
-
* Redis / Memcached via `setDefaultCache()`). When the cache is shared across
|
|
56
|
-
* cluster nodes only one node refreshes per TTL window.
|
|
57
|
-
*
|
|
58
|
-
* Promise deduplication prevents a thundering herd inside a single process:
|
|
59
|
-
* concurrent callers that arrive while the token is being refreshed all await
|
|
60
|
-
* the same in-flight request instead of each issuing their own.
|
|
61
|
-
*/
|
|
62
|
-
async function getCachedAccessToken(serviceAccountKey) {
|
|
63
|
-
const cache = getDefaultCache();
|
|
64
|
-
const cacheKey = googleTokenCacheKey(serviceAccountKey);
|
|
65
|
-
const cached = await cache.get(cacheKey);
|
|
66
|
-
if (cached && cached.expiresAt - Date.now() > 60_000) {
|
|
67
|
-
return cached.token;
|
|
68
|
-
}
|
|
69
|
-
const inflight = refreshPromises.get(cacheKey);
|
|
70
|
-
if (inflight)
|
|
71
|
-
return inflight;
|
|
72
|
-
const promise = getAccessToken(serviceAccountKey)
|
|
73
|
-
.then(async (token) => {
|
|
74
|
-
const expiresAt = Date.now() + 3_600_000;
|
|
75
|
-
// TTL slightly under the 1h Google validity — cache eviction matches token expiry.
|
|
76
|
-
await cache.set(cacheKey, { token, expiresAt }, 3_540);
|
|
77
|
-
return token;
|
|
78
|
-
})
|
|
79
|
-
.finally(() => {
|
|
80
|
-
refreshPromises.delete(cacheKey);
|
|
81
|
-
});
|
|
82
|
-
refreshPromises.set(cacheKey, promise);
|
|
83
|
-
return promise;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Obtain a Google OAuth2 access token using a service account key (JWT assertion flow).
|
|
87
|
-
* The serviceAccountKey is expected to be a JSON string of the service account credentials.
|
|
88
|
-
*/
|
|
89
|
-
async function getAccessToken(serviceAccountKey) {
|
|
90
|
-
let key;
|
|
91
|
-
try {
|
|
92
|
-
key = JSON.parse(serviceAccountKey);
|
|
93
|
-
}
|
|
94
|
-
catch {
|
|
95
|
-
throw new Error('[onesub/google] Invalid serviceAccountKey JSON');
|
|
96
|
-
}
|
|
97
|
-
const tokenUri = key.token_uri ?? 'https://oauth2.googleapis.com/token';
|
|
98
|
-
const scope = 'https://www.googleapis.com/auth/androidpublisher';
|
|
99
|
-
const now = Math.floor(Date.now() / 1000);
|
|
100
|
-
// Build a JWT assertion
|
|
101
|
-
const header = Buffer.from(JSON.stringify({ alg: 'RS256', typ: 'JWT' })).toString('base64url');
|
|
102
|
-
const payload = Buffer.from(JSON.stringify({
|
|
103
|
-
iss: key.client_email,
|
|
104
|
-
scope,
|
|
105
|
-
aud: tokenUri,
|
|
106
|
-
iat: now,
|
|
107
|
-
exp: now + 3600,
|
|
108
|
-
})).toString('base64url');
|
|
109
|
-
const signingInput = `${header}.${payload}`;
|
|
110
|
-
// Sign with the private key using the native crypto module
|
|
111
|
-
const { createSign } = await import('crypto');
|
|
112
|
-
const sign = createSign('RSA-SHA256');
|
|
113
|
-
sign.update(signingInput);
|
|
114
|
-
const signature = sign.sign(key.private_key, 'base64url');
|
|
115
|
-
const assertion = `${signingInput}.${signature}`;
|
|
116
|
-
const resp = await fetchWithTimeout(tokenUri, {
|
|
117
|
-
method: 'POST',
|
|
118
|
-
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
119
|
-
body: new URLSearchParams({
|
|
120
|
-
grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
|
|
121
|
-
assertion,
|
|
122
|
-
}),
|
|
123
|
-
});
|
|
124
|
-
if (!resp.ok) {
|
|
125
|
-
throw new Error(`[onesub/google] Token request failed: ${resp.status}`);
|
|
126
|
-
}
|
|
127
|
-
const data = (await resp.json());
|
|
128
|
-
if (!data.access_token)
|
|
129
|
-
throw new Error('[onesub/google] No access_token in response');
|
|
130
|
-
return data.access_token;
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Fetch a subscription purchase from the Google Play Developer API
|
|
134
|
-
* (purchases.subscriptionsv2.get). The v2 endpoint takes only the purchaseToken
|
|
135
|
-
* — the productId comes back in lineItems, which lets one token represent a
|
|
136
|
-
* multi-product subscription.
|
|
137
|
-
*/
|
|
138
|
-
async function fetchSubscriptionPurchaseV2(packageName, purchaseToken, accessToken) {
|
|
139
|
-
const url = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/` +
|
|
140
|
-
`${encodeURIComponent(packageName)}/purchases/subscriptionsv2/tokens/` +
|
|
141
|
-
`${encodeURIComponent(purchaseToken)}`;
|
|
142
|
-
const resp = await fetchWithTimeout(url, {
|
|
143
|
-
headers: { Authorization: `Bearer ${accessToken}` },
|
|
144
|
-
});
|
|
145
|
-
if (!resp.ok) {
|
|
146
|
-
const body = await resp.text();
|
|
147
|
-
throw new Error(`[onesub/google] Play API v2 error ${resp.status}: ${body}`);
|
|
148
|
-
}
|
|
149
|
-
return resp.json();
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Fetch a one-time product purchase from the Google Play Developer API.
|
|
153
|
-
* Uses purchases.products instead of purchases.subscriptions.
|
|
154
|
-
*/
|
|
155
|
-
async function fetchProductPurchase(packageName, productId, purchaseToken, accessToken) {
|
|
156
|
-
const url = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/` +
|
|
157
|
-
`${encodeURIComponent(packageName)}/purchases/products/` +
|
|
158
|
-
`${encodeURIComponent(productId)}/tokens/${encodeURIComponent(purchaseToken)}`;
|
|
159
|
-
const resp = await fetchWithTimeout(url, {
|
|
160
|
-
headers: { Authorization: `Bearer ${accessToken}` },
|
|
161
|
-
});
|
|
162
|
-
if (!resp.ok) {
|
|
163
|
-
const body = await resp.text();
|
|
164
|
-
throw new Error(`[onesub/google] Play Products API error ${resp.status}: ${body}`);
|
|
165
|
-
}
|
|
166
|
-
return resp.json();
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Acknowledge a Google Play subscription purchase.
|
|
170
|
-
* Google auto-refunds purchases that are not acknowledged within 3 days.
|
|
171
|
-
*
|
|
172
|
-
* Idempotent on Google's side: a no-op when the purchase has already been
|
|
173
|
-
* acknowledged. Fire-and-forget — entitlement was already granted, so failures
|
|
174
|
-
* are logged but not surfaced to the caller (operations should monitor logs).
|
|
175
|
-
*/
|
|
176
|
-
export async function acknowledgeGoogleSubscription(purchaseToken, productId, config) {
|
|
177
|
-
if (config.mockMode)
|
|
178
|
-
return;
|
|
179
|
-
if (!config.serviceAccountKey)
|
|
180
|
-
return;
|
|
181
|
-
if (!config.packageName)
|
|
182
|
-
return;
|
|
183
|
-
let accessToken;
|
|
184
|
-
try {
|
|
185
|
-
accessToken = await getCachedAccessToken(config.serviceAccountKey);
|
|
186
|
-
}
|
|
187
|
-
catch (err) {
|
|
188
|
-
log.warn('[onesub/google] Could not get access token for subscription ack:', err);
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
const url = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/` +
|
|
192
|
-
`${encodeURIComponent(config.packageName)}/purchases/subscriptions/` +
|
|
193
|
-
`${encodeURIComponent(productId)}/tokens/${encodeURIComponent(purchaseToken)}:acknowledge`;
|
|
194
|
-
try {
|
|
195
|
-
const resp = await fetchWithTimeout(url, {
|
|
196
|
-
method: 'POST',
|
|
197
|
-
headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json' },
|
|
198
|
-
body: '{}',
|
|
199
|
-
});
|
|
200
|
-
if (!resp.ok) {
|
|
201
|
-
const body = await resp.text();
|
|
202
|
-
log.warn(`[onesub/google] Subscription acknowledge API error ${resp.status}: ${body} — auto-refund risk`);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
catch (err) {
|
|
206
|
-
log.warn('[onesub/google] Subscription acknowledge network error — auto-refund risk:', err);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Acknowledge a Google Play one-time product purchase (non-consumable).
|
|
211
|
-
* Consumables do not need this — :consume implicitly acknowledges.
|
|
212
|
-
*
|
|
213
|
-
* Same fire-and-forget semantics as acknowledgeGoogleSubscription.
|
|
214
|
-
*/
|
|
215
|
-
export async function acknowledgeGoogleProduct(purchaseToken, productId, config) {
|
|
216
|
-
if (config.mockMode)
|
|
217
|
-
return;
|
|
218
|
-
if (!config.serviceAccountKey)
|
|
219
|
-
return;
|
|
220
|
-
if (!config.packageName)
|
|
221
|
-
return;
|
|
222
|
-
let accessToken;
|
|
223
|
-
try {
|
|
224
|
-
accessToken = await getCachedAccessToken(config.serviceAccountKey);
|
|
225
|
-
}
|
|
226
|
-
catch (err) {
|
|
227
|
-
log.warn('[onesub/google] Could not get access token for product ack:', err);
|
|
228
|
-
return;
|
|
229
|
-
}
|
|
230
|
-
const url = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/` +
|
|
231
|
-
`${encodeURIComponent(config.packageName)}/purchases/products/` +
|
|
232
|
-
`${encodeURIComponent(productId)}/tokens/${encodeURIComponent(purchaseToken)}:acknowledge`;
|
|
233
|
-
try {
|
|
234
|
-
const resp = await fetchWithTimeout(url, {
|
|
235
|
-
method: 'POST',
|
|
236
|
-
headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json' },
|
|
237
|
-
body: '{}',
|
|
238
|
-
});
|
|
239
|
-
if (!resp.ok) {
|
|
240
|
-
const body = await resp.text();
|
|
241
|
-
log.warn(`[onesub/google] Product acknowledge API error ${resp.status}: ${body} — auto-refund risk`);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
catch (err) {
|
|
245
|
-
log.warn('[onesub/google] Product acknowledge network error — auto-refund risk:', err);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* Consume a one-time product purchase via the Google Play Developer API.
|
|
250
|
-
* Must be called for consumables after the entitlement is granted to the user.
|
|
251
|
-
* Google auto-refunds unconsumed purchases after 3 days.
|
|
252
|
-
*
|
|
253
|
-
* This function does not throw — callers should log failures and monitor,
|
|
254
|
-
* as the entitlement has already been granted.
|
|
255
|
-
*/
|
|
256
|
-
export async function consumeGoogleProductReceipt(purchaseToken, productId, config) {
|
|
257
|
-
if (!config.serviceAccountKey)
|
|
258
|
-
return;
|
|
259
|
-
if (!config.packageName)
|
|
260
|
-
return;
|
|
261
|
-
let accessToken;
|
|
262
|
-
try {
|
|
263
|
-
accessToken = await getCachedAccessToken(config.serviceAccountKey);
|
|
264
|
-
}
|
|
265
|
-
catch (err) {
|
|
266
|
-
log.warn('[onesub/google] Could not get access token for consume:', err);
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
const url = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/` +
|
|
270
|
-
`${encodeURIComponent(config.packageName)}/purchases/products/` +
|
|
271
|
-
`${encodeURIComponent(productId)}/tokens/${encodeURIComponent(purchaseToken)}:consume`;
|
|
272
|
-
try {
|
|
273
|
-
const resp = await fetchWithTimeout(url, {
|
|
274
|
-
method: 'POST',
|
|
275
|
-
headers: { Authorization: `Bearer ${accessToken}` },
|
|
276
|
-
});
|
|
277
|
-
if (!resp.ok) {
|
|
278
|
-
const body = await resp.text();
|
|
279
|
-
log.warn(`[onesub/google] Consume API error ${resp.status}: ${body} — auto-refund risk`);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
catch (err) {
|
|
283
|
-
log.warn('[onesub/google] Consume network error — auto-refund risk:', err);
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
/**
|
|
287
|
-
* Map a v2 subscriptionState string to onesub SubscriptionStatus.
|
|
288
|
-
*
|
|
289
|
-
* Returns null when the state is unrecognised or PENDING (initial purchase
|
|
290
|
-
* not yet settled — entitlement should not be granted yet).
|
|
291
|
-
*/
|
|
292
|
-
function deriveStatusV2(state) {
|
|
293
|
-
switch (state) {
|
|
294
|
-
case 'SUBSCRIPTION_STATE_ACTIVE':
|
|
295
|
-
return SUBSCRIPTION_STATUS.ACTIVE;
|
|
296
|
-
case 'SUBSCRIPTION_STATE_IN_GRACE_PERIOD':
|
|
297
|
-
return SUBSCRIPTION_STATUS.GRACE_PERIOD;
|
|
298
|
-
case 'SUBSCRIPTION_STATE_ON_HOLD':
|
|
299
|
-
return SUBSCRIPTION_STATUS.ON_HOLD;
|
|
300
|
-
case 'SUBSCRIPTION_STATE_PAUSED':
|
|
301
|
-
return SUBSCRIPTION_STATUS.PAUSED;
|
|
302
|
-
case 'SUBSCRIPTION_STATE_CANCELED':
|
|
303
|
-
return SUBSCRIPTION_STATUS.CANCELED;
|
|
304
|
-
case 'SUBSCRIPTION_STATE_EXPIRED':
|
|
305
|
-
return SUBSCRIPTION_STATUS.EXPIRED;
|
|
306
|
-
case 'SUBSCRIPTION_STATE_PENDING':
|
|
307
|
-
case 'SUBSCRIPTION_STATE_UNSPECIFIED':
|
|
308
|
-
default:
|
|
309
|
-
return null;
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
/**
|
|
313
|
-
* Validate a Google Play purchase token via purchases.subscriptionsv2.get.
|
|
314
|
-
*
|
|
315
|
-
* The productId argument is used to pick the matching `lineItems` entry. If
|
|
316
|
-
* the response has no lineItem with that productId, validation fails — the
|
|
317
|
-
* token does not entitle the caller to that product. (For multi-product
|
|
318
|
-
* subscriptions, callers can read other lineItems out of the API directly.)
|
|
319
|
-
*
|
|
320
|
-
* @param receipt The purchaseToken from the client (Google Play Billing)
|
|
321
|
-
* @param productId Expected subscription productId — must match a lineItem
|
|
322
|
-
* @param config Google config with packageName + optional serviceAccountKey
|
|
323
|
-
*/
|
|
324
|
-
export async function validateGoogleReceipt(receipt, productId, config) {
|
|
325
|
-
if (config.mockMode)
|
|
326
|
-
return mockValidateGoogleSubscription(receipt, productId);
|
|
327
|
-
if (!config.serviceAccountKey) {
|
|
328
|
-
log.warn('[onesub/google] No serviceAccountKey provided — cannot call Play API');
|
|
329
|
-
return null;
|
|
330
|
-
}
|
|
331
|
-
if (!config.packageName) {
|
|
332
|
-
log.warn('[onesub/google] No packageName provided — cannot call Play API');
|
|
333
|
-
return null;
|
|
334
|
-
}
|
|
335
|
-
let purchase;
|
|
336
|
-
try {
|
|
337
|
-
const token = await getCachedAccessToken(config.serviceAccountKey);
|
|
338
|
-
purchase = await fetchSubscriptionPurchaseV2(config.packageName, receipt, token);
|
|
339
|
-
}
|
|
340
|
-
catch (err) {
|
|
341
|
-
log.error('[onesub/google] Receipt validation failed:', err);
|
|
342
|
-
return null;
|
|
343
|
-
}
|
|
344
|
-
const status = deriveStatusV2(purchase.subscriptionState);
|
|
345
|
-
if (!status) {
|
|
346
|
-
log.warn('[onesub/google] Unrecognised or pending subscriptionState — rejecting:', purchase.subscriptionState);
|
|
347
|
-
return null;
|
|
348
|
-
}
|
|
349
|
-
// Pick the lineItem matching the requested productId. v2 supports multi-product
|
|
350
|
-
// subscriptions so the same token can carry several lineItems; we only entitle
|
|
351
|
-
// the caller for the productId they explicitly asked about.
|
|
352
|
-
const lineItem = purchase.lineItems?.find((item) => item.productId === productId);
|
|
353
|
-
if (!lineItem) {
|
|
354
|
-
log.warn('[onesub/google] productId not found in subscription lineItems:', productId, 'available:', purchase.lineItems?.map((i) => i.productId).join(', ') ?? '(none)');
|
|
355
|
-
return null;
|
|
356
|
-
}
|
|
357
|
-
const expiresAt = lineItem.expiryTime ?? new Date().toISOString();
|
|
358
|
-
const purchasedAt = purchase.startTime ?? new Date().toISOString();
|
|
359
|
-
const willRenew = lineItem.autoRenewingPlan?.autoRenewEnabled ?? false;
|
|
360
|
-
// Surface autoResumeTime only when the subscription is actually paused —
|
|
361
|
-
// pausedStateContext is undefined for any other state, but be defensive in
|
|
362
|
-
// case Google starts including it on adjacent states (e.g. recently-resumed).
|
|
363
|
-
const autoResumeTime = status === SUBSCRIPTION_STATUS.PAUSED
|
|
364
|
-
? purchase.pausedStateContext?.autoResumeTime
|
|
365
|
-
: undefined;
|
|
366
|
-
return {
|
|
367
|
-
userId: '', // caller fills this in
|
|
368
|
-
productId,
|
|
369
|
-
platform: 'google',
|
|
370
|
-
status,
|
|
371
|
-
expiresAt,
|
|
372
|
-
originalTransactionId: purchase.latestOrderId ?? receipt.slice(0, 64),
|
|
373
|
-
purchasedAt,
|
|
374
|
-
willRenew,
|
|
375
|
-
// Surface the linked token so host apps (and our webhook userId-continuity
|
|
376
|
-
// logic) can follow upgrade/downgrade chains.
|
|
377
|
-
linkedPurchaseToken: purchase.linkedPurchaseToken,
|
|
378
|
-
autoResumeTime,
|
|
379
|
-
};
|
|
380
|
-
}
|
|
381
|
-
/**
|
|
382
|
-
* Validate a Google Play purchase token for a one-time product (consumable or
|
|
383
|
-
* non-consumable). Uses purchases.products, not purchases.subscriptions.
|
|
384
|
-
*
|
|
385
|
-
* Security checks applied beyond basic API verification:
|
|
386
|
-
* - purchaseState must be 0 (completed)
|
|
387
|
-
* - consumptionState checked for consumables: already-consumed tokens indicate replay
|
|
388
|
-
* - Receipt age limited to 72 hours
|
|
389
|
-
* - orderId used as transactionId (per-purchase unique, unlike purchaseToken)
|
|
390
|
-
*/
|
|
391
|
-
export async function validateGoogleProductReceipt(purchaseToken, productId, config, type = 'non_consumable') {
|
|
392
|
-
if (config.mockMode)
|
|
393
|
-
return mockValidateGoogleProduct(purchaseToken, productId);
|
|
394
|
-
if (!config.serviceAccountKey) {
|
|
395
|
-
log.warn('[onesub/google] No serviceAccountKey — cannot validate product receipt');
|
|
396
|
-
return null;
|
|
397
|
-
}
|
|
398
|
-
if (!config.packageName) {
|
|
399
|
-
log.warn('[onesub/google] No packageName — cannot validate product receipt');
|
|
400
|
-
return null;
|
|
401
|
-
}
|
|
402
|
-
let purchase;
|
|
403
|
-
try {
|
|
404
|
-
const token = await getCachedAccessToken(config.serviceAccountKey);
|
|
405
|
-
purchase = await fetchProductPurchase(config.packageName, productId, purchaseToken, token);
|
|
406
|
-
}
|
|
407
|
-
catch (err) {
|
|
408
|
-
log.error('[onesub/google] Product receipt validation failed:', err);
|
|
409
|
-
return null;
|
|
410
|
-
}
|
|
411
|
-
// purchaseState 0 = completed (1 = canceled, 2 = pending)
|
|
412
|
-
if (purchase.purchaseState !== 0) {
|
|
413
|
-
log.warn('[onesub/google] Purchase not completed, state:', purchase.purchaseState);
|
|
414
|
-
return null;
|
|
415
|
-
}
|
|
416
|
-
// For consumables: consumptionState 1 means already consumed by a previous request.
|
|
417
|
-
// This is the primary replay-attack signal for consumables on Android.
|
|
418
|
-
if (type === 'consumable' && purchase.consumptionState === 1) {
|
|
419
|
-
log.warn('[onesub/google] Consumable already consumed — possible replay attack');
|
|
420
|
-
return null;
|
|
421
|
-
}
|
|
422
|
-
// Reject receipts older than 72 hours
|
|
423
|
-
if (purchase.purchaseTimeMillis) {
|
|
424
|
-
const purchaseTime = parseInt(purchase.purchaseTimeMillis, 10);
|
|
425
|
-
if (Date.now() - purchaseTime > MAX_PRODUCT_RECEIPT_AGE_MS) {
|
|
426
|
-
log.warn('[onesub/google] Product receipt too old (>72h)');
|
|
427
|
-
return null;
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
if (!purchase.orderId) {
|
|
431
|
-
log.warn('[onesub/google] No orderId in product purchase');
|
|
432
|
-
return null;
|
|
433
|
-
}
|
|
434
|
-
return {
|
|
435
|
-
transactionId: purchase.orderId,
|
|
436
|
-
purchasedAt: purchase.purchaseTimeMillis
|
|
437
|
-
? new Date(parseInt(purchase.purchaseTimeMillis, 10)).toISOString()
|
|
438
|
-
: new Date().toISOString(),
|
|
439
|
-
};
|
|
440
|
-
}
|
|
441
|
-
/**
|
|
442
|
-
* Decode a Google RTDN Pub/Sub notification.
|
|
443
|
-
* Returns the extracted subscription notification data, or null for test pings
|
|
444
|
-
* and notification kinds handled by other decoders (e.g. voided purchases).
|
|
445
|
-
*/
|
|
446
|
-
export function decodeGoogleNotification(payload) {
|
|
447
|
-
let notification;
|
|
448
|
-
try {
|
|
449
|
-
const json = Buffer.from(payload.message.data, 'base64').toString('utf-8');
|
|
450
|
-
notification = JSON.parse(json);
|
|
451
|
-
}
|
|
452
|
-
catch {
|
|
453
|
-
return null;
|
|
454
|
-
}
|
|
455
|
-
if (!notification.subscriptionNotification) {
|
|
456
|
-
// test notification, voided purchase, or unsupported type
|
|
457
|
-
return null;
|
|
458
|
-
}
|
|
459
|
-
const { notificationType, purchaseToken, subscriptionId } = notification.subscriptionNotification;
|
|
460
|
-
return {
|
|
461
|
-
notificationType,
|
|
462
|
-
purchaseToken,
|
|
463
|
-
subscriptionId,
|
|
464
|
-
packageName: notification.packageName,
|
|
465
|
-
};
|
|
466
|
-
}
|
|
467
|
-
/**
|
|
468
|
-
* Decode a Google RTDN voidedPurchaseNotification, if the payload is one.
|
|
469
|
-
* Returns null when the payload is a different notification kind.
|
|
470
|
-
*/
|
|
471
|
-
export function decodeGoogleVoidedNotification(payload) {
|
|
472
|
-
let notification;
|
|
473
|
-
try {
|
|
474
|
-
const json = Buffer.from(payload.message.data, 'base64').toString('utf-8');
|
|
475
|
-
notification = JSON.parse(json);
|
|
476
|
-
}
|
|
477
|
-
catch {
|
|
478
|
-
return null;
|
|
479
|
-
}
|
|
480
|
-
if (!notification.voidedPurchaseNotification)
|
|
481
|
-
return null;
|
|
482
|
-
const { purchaseToken, orderId, productType, refundType } = notification.voidedPurchaseNotification;
|
|
483
|
-
return {
|
|
484
|
-
purchaseToken,
|
|
485
|
-
orderId,
|
|
486
|
-
productType,
|
|
487
|
-
refundType,
|
|
488
|
-
packageName: notification.packageName,
|
|
489
|
-
};
|
|
490
|
-
}
|
|
491
|
-
/**
|
|
492
|
-
* Decode a Google RTDN oneTimeProductNotification, if the payload is one.
|
|
493
|
-
* Returns null when the payload is a different notification kind.
|
|
494
|
-
*
|
|
495
|
-
* Note: the notification does NOT carry userId context. For PURCHASED, the
|
|
496
|
-
* receipt must be acknowledged via acknowledgeGoogleProduct to prevent the
|
|
497
|
-
* 3-day auto-refund window. The userId is only known after the client calls
|
|
498
|
-
* POST /onesub/purchase/validate, which is the authoritative record-creation
|
|
499
|
-
* path. The webhook handler therefore acknowledges without creating a record.
|
|
500
|
-
*/
|
|
501
|
-
export function decodeGoogleOneTimeProductNotification(payload) {
|
|
502
|
-
let notification;
|
|
503
|
-
try {
|
|
504
|
-
const json = Buffer.from(payload.message.data, 'base64').toString('utf-8');
|
|
505
|
-
notification = JSON.parse(json);
|
|
506
|
-
}
|
|
507
|
-
catch {
|
|
508
|
-
return null;
|
|
509
|
-
}
|
|
510
|
-
if (!notification.oneTimeProductNotification)
|
|
511
|
-
return null;
|
|
512
|
-
const { notificationType, purchaseToken, sku } = notification.oneTimeProductNotification;
|
|
513
|
-
if (notificationType !== 1 && notificationType !== 2) {
|
|
514
|
-
log.warn('[onesub/google] Unknown oneTimeProductNotification type:', notificationType);
|
|
515
|
-
return null;
|
|
516
|
-
}
|
|
517
|
-
return { notificationType, purchaseToken, sku, packageName: notification.packageName };
|
|
518
|
-
}
|
|
519
|
-
/**
|
|
520
|
-
* Determine if a Google RTDN notification type represents an active subscription
|
|
521
|
-
* inside the paid window (excludes grace period — that's a separate state now).
|
|
522
|
-
*/
|
|
523
|
-
export function isGoogleActiveNotification(notificationType) {
|
|
524
|
-
return (notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_PURCHASED ||
|
|
525
|
-
notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_RENEWED ||
|
|
526
|
-
notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_RECOVERED ||
|
|
527
|
-
notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_RESTARTED);
|
|
528
|
-
}
|
|
529
|
-
export function isGoogleCanceledNotification(notificationType) {
|
|
530
|
-
return (notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_CANCELED ||
|
|
531
|
-
notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_REVOKED);
|
|
532
|
-
}
|
|
533
|
-
export function isGoogleExpiredNotification(notificationType) {
|
|
534
|
-
return notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_EXPIRED;
|
|
535
|
-
}
|
|
536
|
-
/**
|
|
537
|
-
* Subscription is in the store-granted grace period — payment failed but the
|
|
538
|
-
* user retains access while Google retries. Maps to SUBSCRIPTION_STATUS.GRACE_PERIOD.
|
|
539
|
-
*/
|
|
540
|
-
export function isGoogleGracePeriodNotification(notificationType) {
|
|
541
|
-
return notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_IN_GRACE_PERIOD;
|
|
542
|
-
}
|
|
543
|
-
/**
|
|
544
|
-
* Subscription is on hold — grace period ended, retry continuing, entitlement
|
|
545
|
-
* REVOKED. Maps to SUBSCRIPTION_STATUS.ON_HOLD.
|
|
546
|
-
*/
|
|
547
|
-
export function isGoogleOnHoldNotification(notificationType) {
|
|
548
|
-
return notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_ON_HOLD;
|
|
549
|
-
}
|
|
550
|
-
/**
|
|
551
|
-
* User-voluntary pause — entitlement REVOKED until autoResumeTime or manual
|
|
552
|
-
* resume. Maps to SUBSCRIPTION_STATUS.PAUSED.
|
|
553
|
-
*/
|
|
554
|
-
export function isGooglePausedNotification(notificationType) {
|
|
555
|
-
return notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_PAUSED;
|
|
556
|
-
}
|
|
557
|
-
/**
|
|
558
|
-
* User agreed to a developer-initiated price change. The new price applies
|
|
559
|
-
* on the next renewal. Subscription remains active in the meantime.
|
|
560
|
-
*/
|
|
561
|
-
export function isGooglePriceChangeConfirmedNotification(notificationType) {
|
|
562
|
-
return notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_PRICE_CHANGE_CONFIRMED;
|
|
563
|
-
}
|
|
564
|
-
//# sourceMappingURL=google.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"google.js","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"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"}
|