@onesub/server 0.7.2 → 0.8.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.
Files changed (92) hide show
  1. package/README.md +1 -0
  2. package/dist/__tests__/apple-status-api.test.d.ts +14 -0
  3. package/dist/__tests__/apple-status-api.test.d.ts.map +1 -0
  4. package/dist/__tests__/apple-status-api.test.js +345 -0
  5. package/dist/__tests__/apple-status-api.test.js.map +1 -0
  6. package/dist/__tests__/error-codes.test.js +16 -0
  7. package/dist/__tests__/error-codes.test.js.map +1 -1
  8. package/dist/__tests__/google-paused.test.d.ts +10 -0
  9. package/dist/__tests__/google-paused.test.d.ts.map +1 -0
  10. package/dist/__tests__/google-paused.test.js +126 -0
  11. package/dist/__tests__/google-paused.test.js.map +1 -0
  12. package/dist/__tests__/google-price-change.test.d.ts +6 -0
  13. package/dist/__tests__/google-price-change.test.d.ts.map +1 -0
  14. package/dist/__tests__/google-price-change.test.js +186 -0
  15. package/dist/__tests__/google-price-change.test.js.map +1 -0
  16. package/dist/__tests__/google-subscriptions-v2.test.d.ts +13 -0
  17. package/dist/__tests__/google-subscriptions-v2.test.d.ts.map +1 -0
  18. package/dist/__tests__/google-subscriptions-v2.test.js +206 -0
  19. package/dist/__tests__/google-subscriptions-v2.test.js.map +1 -0
  20. package/dist/__tests__/lifecycle-states.test.d.ts +12 -0
  21. package/dist/__tests__/lifecycle-states.test.d.ts.map +1 -0
  22. package/dist/__tests__/lifecycle-states.test.js +423 -0
  23. package/dist/__tests__/lifecycle-states.test.js.map +1 -0
  24. package/dist/__tests__/linked-purchase-token.test.d.ts +9 -0
  25. package/dist/__tests__/linked-purchase-token.test.d.ts.map +1 -0
  26. package/dist/__tests__/linked-purchase-token.test.js +227 -0
  27. package/dist/__tests__/linked-purchase-token.test.js.map +1 -0
  28. package/dist/__tests__/mock-provider.test.d.ts +2 -0
  29. package/dist/__tests__/mock-provider.test.d.ts.map +1 -0
  30. package/dist/__tests__/mock-provider.test.js +188 -0
  31. package/dist/__tests__/mock-provider.test.js.map +1 -0
  32. package/dist/__tests__/providers.test.js +69 -9
  33. package/dist/__tests__/providers.test.js.map +1 -1
  34. package/dist/__tests__/refund-policy.test.d.ts +11 -0
  35. package/dist/__tests__/refund-policy.test.d.ts.map +1 -0
  36. package/dist/__tests__/refund-policy.test.js +317 -0
  37. package/dist/__tests__/refund-policy.test.js.map +1 -0
  38. package/dist/__tests__/store.test.js +17 -0
  39. package/dist/__tests__/store.test.js.map +1 -1
  40. package/dist/__tests__/test-utils.d.ts +20 -0
  41. package/dist/__tests__/test-utils.d.ts.map +1 -0
  42. package/dist/__tests__/test-utils.js +30 -0
  43. package/dist/__tests__/test-utils.js.map +1 -0
  44. package/dist/__tests__/webhook-refund.test.d.ts +13 -0
  45. package/dist/__tests__/webhook-refund.test.d.ts.map +1 -0
  46. package/dist/__tests__/webhook-refund.test.js +313 -0
  47. package/dist/__tests__/webhook-refund.test.js.map +1 -0
  48. package/dist/index.d.ts +1 -1
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +9 -2
  51. package/dist/index.js.map +1 -1
  52. package/dist/providers/apple.d.ts +45 -2
  53. package/dist/providers/apple.d.ts.map +1 -1
  54. package/dist/providers/apple.js +202 -2
  55. package/dist/providers/apple.js.map +1 -1
  56. package/dist/providers/google.d.ts +71 -6
  57. package/dist/providers/google.d.ts.map +1 -1
  58. package/dist/providers/google.js +204 -32
  59. package/dist/providers/google.js.map +1 -1
  60. package/dist/providers/mock.d.ts +46 -0
  61. package/dist/providers/mock.d.ts.map +1 -0
  62. package/dist/providers/mock.js +93 -0
  63. package/dist/providers/mock.js.map +1 -0
  64. package/dist/routes/admin.d.ts.map +1 -1
  65. package/dist/routes/admin.js +4 -2
  66. package/dist/routes/admin.js.map +1 -1
  67. package/dist/routes/purchase.d.ts.map +1 -1
  68. package/dist/routes/purchase.js +15 -6
  69. package/dist/routes/purchase.js.map +1 -1
  70. package/dist/routes/status.d.ts.map +1 -1
  71. package/dist/routes/status.js +14 -1
  72. package/dist/routes/status.js.map +1 -1
  73. package/dist/routes/validate.d.ts.map +1 -1
  74. package/dist/routes/validate.js +7 -1
  75. package/dist/routes/validate.js.map +1 -1
  76. package/dist/routes/webhook.d.ts +2 -2
  77. package/dist/routes/webhook.d.ts.map +1 -1
  78. package/dist/routes/webhook.js +219 -27
  79. package/dist/routes/webhook.js.map +1 -1
  80. package/dist/store.d.ts +9 -0
  81. package/dist/store.d.ts.map +1 -1
  82. package/dist/store.js +12 -0
  83. package/dist/store.js.map +1 -1
  84. package/dist/stores/postgres.d.ts +1 -0
  85. package/dist/stores/postgres.d.ts.map +1 -1
  86. package/dist/stores/postgres.js +10 -2
  87. package/dist/stores/postgres.js.map +1 -1
  88. package/dist/stores/schema.d.ts.map +1 -1
  89. package/dist/stores/schema.js +5 -0
  90. package/dist/stores/schema.js.map +1 -1
  91. package/package.json +2 -2
  92. package/sql/schema.sql +5 -0
@@ -1,5 +1,6 @@
1
1
  import { SUBSCRIPTION_STATUS } from '@onesub/shared';
2
2
  import { log } from '../logger.js';
3
+ import { mockValidateGoogleSubscription, mockValidateGoogleProduct, } from './mock.js';
3
4
  /**
4
5
  * Google RTDN notification types.
5
6
  * https://developer.android.com/google/play/billing/rtdn-reference
@@ -99,16 +100,21 @@ async function getAccessToken(serviceAccountKey) {
99
100
  return data.access_token;
100
101
  }
101
102
  /**
102
- * Fetch a subscription purchase from the Google Play Developer API.
103
+ * Fetch a subscription purchase from the Google Play Developer API
104
+ * (purchases.subscriptionsv2.get). The v2 endpoint takes only the purchaseToken
105
+ * — the productId comes back in lineItems, which lets one token represent a
106
+ * multi-product subscription.
103
107
  */
104
- async function fetchSubscriptionPurchase(packageName, productId, purchaseToken, accessToken) {
105
- const url = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${encodeURIComponent(packageName)}/purchases/subscriptions/${encodeURIComponent(productId)}/tokens/${encodeURIComponent(purchaseToken)}`;
108
+ async function fetchSubscriptionPurchaseV2(packageName, purchaseToken, accessToken) {
109
+ const url = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/` +
110
+ `${encodeURIComponent(packageName)}/purchases/subscriptionsv2/tokens/` +
111
+ `${encodeURIComponent(purchaseToken)}`;
106
112
  const resp = await fetch(url, {
107
113
  headers: { Authorization: `Bearer ${accessToken}` },
108
114
  });
109
115
  if (!resp.ok) {
110
116
  const body = await resp.text();
111
- throw new Error(`[onesub/google] Play API error ${resp.status}: ${body}`);
117
+ throw new Error(`[onesub/google] Play API v2 error ${resp.status}: ${body}`);
112
118
  }
113
119
  return resp.json();
114
120
  }
@@ -129,6 +135,82 @@ async function fetchProductPurchase(packageName, productId, purchaseToken, acces
129
135
  }
130
136
  return resp.json();
131
137
  }
138
+ /**
139
+ * Acknowledge a Google Play subscription purchase.
140
+ * Google auto-refunds purchases that are not acknowledged within 3 days.
141
+ *
142
+ * Idempotent on Google's side: a no-op when the purchase has already been
143
+ * acknowledged. Fire-and-forget — entitlement was already granted, so failures
144
+ * are logged but not surfaced to the caller (operations should monitor logs).
145
+ */
146
+ export async function acknowledgeGoogleSubscription(purchaseToken, productId, config) {
147
+ if (config.mockMode)
148
+ return;
149
+ if (!config.serviceAccountKey)
150
+ return;
151
+ let accessToken;
152
+ try {
153
+ accessToken = await getCachedAccessToken(config.serviceAccountKey);
154
+ }
155
+ catch (err) {
156
+ log.warn('[onesub/google] Could not get access token for subscription ack:', err);
157
+ return;
158
+ }
159
+ const url = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/` +
160
+ `${encodeURIComponent(config.packageName)}/purchases/subscriptions/` +
161
+ `${encodeURIComponent(productId)}/tokens/${encodeURIComponent(purchaseToken)}:acknowledge`;
162
+ try {
163
+ const resp = await fetch(url, {
164
+ method: 'POST',
165
+ headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json' },
166
+ body: '{}',
167
+ });
168
+ if (!resp.ok) {
169
+ const body = await resp.text();
170
+ log.warn(`[onesub/google] Subscription acknowledge API error ${resp.status}: ${body} — auto-refund risk`);
171
+ }
172
+ }
173
+ catch (err) {
174
+ log.warn('[onesub/google] Subscription acknowledge network error — auto-refund risk:', err);
175
+ }
176
+ }
177
+ /**
178
+ * Acknowledge a Google Play one-time product purchase (non-consumable).
179
+ * Consumables do not need this — :consume implicitly acknowledges.
180
+ *
181
+ * Same fire-and-forget semantics as acknowledgeGoogleSubscription.
182
+ */
183
+ export async function acknowledgeGoogleProduct(purchaseToken, productId, config) {
184
+ if (config.mockMode)
185
+ return;
186
+ if (!config.serviceAccountKey)
187
+ return;
188
+ let accessToken;
189
+ try {
190
+ accessToken = await getCachedAccessToken(config.serviceAccountKey);
191
+ }
192
+ catch (err) {
193
+ log.warn('[onesub/google] Could not get access token for product ack:', err);
194
+ return;
195
+ }
196
+ const url = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/` +
197
+ `${encodeURIComponent(config.packageName)}/purchases/products/` +
198
+ `${encodeURIComponent(productId)}/tokens/${encodeURIComponent(purchaseToken)}:acknowledge`;
199
+ try {
200
+ const resp = await fetch(url, {
201
+ method: 'POST',
202
+ headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json' },
203
+ body: '{}',
204
+ });
205
+ if (!resp.ok) {
206
+ const body = await resp.text();
207
+ log.warn(`[onesub/google] Product acknowledge API error ${resp.status}: ${body} — auto-refund risk`);
208
+ }
209
+ }
210
+ catch (err) {
211
+ log.warn('[onesub/google] Product acknowledge network error — auto-refund risk:', err);
212
+ }
213
+ }
132
214
  /**
133
215
  * Consume a one-time product purchase via the Google Play Developer API.
134
216
  * Must be called for consumables after the entitlement is granted to the user.
@@ -166,27 +248,46 @@ export async function consumeGoogleProductReceipt(purchaseToken, productId, conf
166
248
  }
167
249
  }
168
250
  /**
169
- * Derive a SubscriptionStatus from a Google Play purchase resource.
251
+ * Map a v2 subscriptionState string to onesub SubscriptionStatus.
252
+ *
253
+ * Returns null when the state is unrecognised or PENDING (initial purchase
254
+ * not yet settled — entitlement should not be granted yet).
170
255
  */
171
- function deriveStatus(purchase) {
172
- const now = Date.now();
173
- const expiryMs = purchase.expiryTimeMillis ? parseInt(purchase.expiryTimeMillis, 10) : 0;
174
- if (expiryMs > now) {
175
- // paymentState 0 = pending (grace period treated as active)
176
- return SUBSCRIPTION_STATUS.ACTIVE;
177
- }
178
- if (purchase.cancelReason !== undefined)
179
- return SUBSCRIPTION_STATUS.CANCELED;
180
- return SUBSCRIPTION_STATUS.EXPIRED;
256
+ function deriveStatusV2(state) {
257
+ switch (state) {
258
+ case 'SUBSCRIPTION_STATE_ACTIVE':
259
+ return SUBSCRIPTION_STATUS.ACTIVE;
260
+ case 'SUBSCRIPTION_STATE_IN_GRACE_PERIOD':
261
+ return SUBSCRIPTION_STATUS.GRACE_PERIOD;
262
+ case 'SUBSCRIPTION_STATE_ON_HOLD':
263
+ return SUBSCRIPTION_STATUS.ON_HOLD;
264
+ case 'SUBSCRIPTION_STATE_PAUSED':
265
+ return SUBSCRIPTION_STATUS.PAUSED;
266
+ case 'SUBSCRIPTION_STATE_CANCELED':
267
+ return SUBSCRIPTION_STATUS.CANCELED;
268
+ case 'SUBSCRIPTION_STATE_EXPIRED':
269
+ return SUBSCRIPTION_STATUS.EXPIRED;
270
+ case 'SUBSCRIPTION_STATE_PENDING':
271
+ case 'SUBSCRIPTION_STATE_UNSPECIFIED':
272
+ default:
273
+ return null;
274
+ }
181
275
  }
182
276
  /**
183
- * Validate a Google Play purchase token.
277
+ * Validate a Google Play purchase token via purchases.subscriptionsv2.get.
184
278
  *
185
- * @param receipt - The purchaseToken from the client (Google Play Billing)
186
- * @param productId - The subscription product ID
187
- * @param config - Google config with packageName and optional serviceAccountKey
279
+ * The productId argument is used to pick the matching `lineItems` entry. If
280
+ * the response has no lineItem with that productId, validation fails the
281
+ * token does not entitle the caller to that product. (For multi-product
282
+ * subscriptions, callers can read other lineItems out of the API directly.)
283
+ *
284
+ * @param receipt The purchaseToken from the client (Google Play Billing)
285
+ * @param productId Expected subscription productId — must match a lineItem
286
+ * @param config Google config with packageName + optional serviceAccountKey
188
287
  */
189
288
  export async function validateGoogleReceipt(receipt, productId, config) {
289
+ if (config.mockMode)
290
+ return mockValidateGoogleSubscription(receipt, productId);
190
291
  if (!config.serviceAccountKey) {
191
292
  log.warn('[onesub/google] No serviceAccountKey provided — cannot call Play API');
192
293
  return null;
@@ -194,24 +295,40 @@ export async function validateGoogleReceipt(receipt, productId, config) {
194
295
  let purchase;
195
296
  try {
196
297
  const token = await getCachedAccessToken(config.serviceAccountKey);
197
- purchase = await fetchSubscriptionPurchase(config.packageName, productId, receipt, token);
298
+ purchase = await fetchSubscriptionPurchaseV2(config.packageName, receipt, token);
198
299
  }
199
300
  catch (err) {
200
301
  log.error('[onesub/google] Receipt validation failed:', err);
201
302
  return null;
202
303
  }
203
- const status = deriveStatus(purchase);
204
- const expiryMs = purchase.expiryTimeMillis ? parseInt(purchase.expiryTimeMillis, 10) : Date.now();
205
- const startMs = purchase.startTimeMillis ? parseInt(purchase.startTimeMillis, 10) : Date.now();
304
+ const status = deriveStatusV2(purchase.subscriptionState);
305
+ if (!status) {
306
+ log.warn('[onesub/google] Unrecognised or pending subscriptionState rejecting:', purchase.subscriptionState);
307
+ return null;
308
+ }
309
+ // Pick the lineItem matching the requested productId. v2 supports multi-product
310
+ // subscriptions so the same token can carry several lineItems; we only entitle
311
+ // the caller for the productId they explicitly asked about.
312
+ const lineItem = purchase.lineItems?.find((item) => item.productId === productId);
313
+ if (!lineItem) {
314
+ log.warn('[onesub/google] productId not found in subscription lineItems:', productId, 'available:', purchase.lineItems?.map((i) => i.productId).join(', ') ?? '(none)');
315
+ return null;
316
+ }
317
+ const expiresAt = lineItem.expiryTime ?? new Date().toISOString();
318
+ const purchasedAt = purchase.startTime ?? new Date().toISOString();
319
+ const willRenew = lineItem.autoRenewingPlan?.autoRenewEnabled ?? false;
206
320
  return {
207
321
  userId: '', // caller fills this in
208
322
  productId,
209
323
  platform: 'google',
210
324
  status,
211
- expiresAt: new Date(expiryMs).toISOString(),
212
- originalTransactionId: purchase.orderId ?? receipt.slice(0, 64),
213
- purchasedAt: new Date(startMs).toISOString(),
214
- willRenew: purchase.autoRenewing ?? false,
325
+ expiresAt,
326
+ originalTransactionId: purchase.latestOrderId ?? receipt.slice(0, 64),
327
+ purchasedAt,
328
+ willRenew,
329
+ // Surface the linked token so host apps (and our webhook userId-continuity
330
+ // logic) can follow upgrade/downgrade chains.
331
+ linkedPurchaseToken: purchase.linkedPurchaseToken,
215
332
  };
216
333
  }
217
334
  /**
@@ -225,6 +342,8 @@ export async function validateGoogleReceipt(receipt, productId, config) {
225
342
  * - orderId used as transactionId (per-purchase unique, unlike purchaseToken)
226
343
  */
227
344
  export async function validateGoogleProductReceipt(purchaseToken, productId, config, type = 'non_consumable') {
345
+ if (config.mockMode)
346
+ return mockValidateGoogleProduct(purchaseToken, productId);
228
347
  if (!config.serviceAccountKey) {
229
348
  log.warn('[onesub/google] No serviceAccountKey — cannot validate product receipt');
230
349
  return null;
@@ -270,7 +389,8 @@ export async function validateGoogleProductReceipt(purchaseToken, productId, con
270
389
  }
271
390
  /**
272
391
  * Decode a Google RTDN Pub/Sub notification.
273
- * Returns the extracted subscription notification data, or null for test pings.
392
+ * Returns the extracted subscription notification data, or null for test pings
393
+ * and notification kinds handled by other decoders (e.g. voided purchases).
274
394
  */
275
395
  export function decodeGoogleNotification(payload) {
276
396
  let notification;
@@ -282,7 +402,7 @@ export function decodeGoogleNotification(payload) {
282
402
  return null;
283
403
  }
284
404
  if (!notification.subscriptionNotification) {
285
- // test notification or unsupported type
405
+ // test notification, voided purchase, or unsupported type
286
406
  return null;
287
407
  }
288
408
  const { notificationType, purchaseToken, subscriptionId } = notification.subscriptionNotification;
@@ -294,14 +414,38 @@ export function decodeGoogleNotification(payload) {
294
414
  };
295
415
  }
296
416
  /**
297
- * Determine if a Google RTDN notification type represents an active subscription.
417
+ * Decode a Google RTDN voidedPurchaseNotification, if the payload is one.
418
+ * Returns null when the payload is a different notification kind.
419
+ */
420
+ export function decodeGoogleVoidedNotification(payload) {
421
+ let notification;
422
+ try {
423
+ const json = Buffer.from(payload.message.data, 'base64').toString('utf-8');
424
+ notification = JSON.parse(json);
425
+ }
426
+ catch {
427
+ return null;
428
+ }
429
+ if (!notification.voidedPurchaseNotification)
430
+ return null;
431
+ const { purchaseToken, orderId, productType, refundType } = notification.voidedPurchaseNotification;
432
+ return {
433
+ purchaseToken,
434
+ orderId,
435
+ productType,
436
+ refundType,
437
+ packageName: notification.packageName,
438
+ };
439
+ }
440
+ /**
441
+ * Determine if a Google RTDN notification type represents an active subscription
442
+ * inside the paid window (excludes grace period — that's a separate state now).
298
443
  */
299
444
  export function isGoogleActiveNotification(notificationType) {
300
445
  return (notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_PURCHASED ||
301
446
  notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_RENEWED ||
302
447
  notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_RECOVERED ||
303
- notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_RESTARTED ||
304
- notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_IN_GRACE_PERIOD);
448
+ notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_RESTARTED);
305
449
  }
306
450
  export function isGoogleCanceledNotification(notificationType) {
307
451
  return (notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_CANCELED ||
@@ -310,4 +454,32 @@ export function isGoogleCanceledNotification(notificationType) {
310
454
  export function isGoogleExpiredNotification(notificationType) {
311
455
  return notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_EXPIRED;
312
456
  }
457
+ /**
458
+ * Subscription is in the store-granted grace period — payment failed but the
459
+ * user retains access while Google retries. Maps to SUBSCRIPTION_STATUS.GRACE_PERIOD.
460
+ */
461
+ export function isGoogleGracePeriodNotification(notificationType) {
462
+ return notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_IN_GRACE_PERIOD;
463
+ }
464
+ /**
465
+ * Subscription is on hold — grace period ended, retry continuing, entitlement
466
+ * REVOKED. Maps to SUBSCRIPTION_STATUS.ON_HOLD.
467
+ */
468
+ export function isGoogleOnHoldNotification(notificationType) {
469
+ return notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_ON_HOLD;
470
+ }
471
+ /**
472
+ * User-voluntary pause — entitlement REVOKED until autoResumeTime or manual
473
+ * resume. Maps to SUBSCRIPTION_STATUS.PAUSED.
474
+ */
475
+ export function isGooglePausedNotification(notificationType) {
476
+ return notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_PAUSED;
477
+ }
478
+ /**
479
+ * User agreed to a developer-initiated price change. The new price applies
480
+ * on the next renewal. Subscription remains active in the meantime.
481
+ */
482
+ export function isGooglePriceChangeConfirmedNotification(notificationType) {
483
+ return notificationType === GOOGLE_NOTIFICATION_TYPE.SUBSCRIPTION_PRICE_CHANGE_CONFIRMED;
484
+ }
313
485
  //# sourceMappingURL=google.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"google.js","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"google.js","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { SubscriptionInfo } from '@onesub/shared';
2
+ /**
3
+ * Mock provider — returns deterministic receipt-validation results based on
4
+ * the receipt string pattern. Used when `config.{apple,google}.mockMode` is
5
+ * true so developers / CI / AI agents can exercise the full onesub flow
6
+ * without App Store Connect or Play Developer API credentials.
7
+ *
8
+ * ──────────────────────────────────────────────────────────────────────
9
+ * Receipt prefix (see `MOCK_RECEIPT_PREFIX` in @onesub/shared)
10
+ * ──────────────────────────────────────────────────────────────────────
11
+ * REVOKED → null (revoked/refunded)
12
+ * EXPIRED → null (> 72h old)
13
+ * INVALID / BAD_SIG → null (signature / integrity fail)
14
+ * NETWORK_ERROR → throws (simulates upstream failure)
15
+ * SANDBOX → valid; subscription has a shorter expiry (~1h)
16
+ * <anything else> → valid; transactionId = sha256(receipt)[:24]
17
+ *
18
+ * transactionId is derived from sha256(receipt) so the same receipt always
19
+ * produces the same id — useful for replay / idempotency testing.
20
+ */
21
+ export type MockReceiptOutcome = {
22
+ kind: 'valid';
23
+ } | {
24
+ kind: 'sandbox';
25
+ } | {
26
+ kind: 'revoked';
27
+ } | {
28
+ kind: 'expired';
29
+ } | {
30
+ kind: 'invalid';
31
+ } | {
32
+ kind: 'network-error';
33
+ };
34
+ export declare function classifyMockReceipt(receipt: string): MockReceiptOutcome;
35
+ export declare function mockValidateAppleSubscription(receipt: string): SubscriptionInfo | null;
36
+ export declare function mockValidateAppleProduct(receipt: string, expectedProductId?: string): {
37
+ transactionId: string;
38
+ productId: string;
39
+ purchasedAt: string;
40
+ } | null;
41
+ export declare function mockValidateGoogleSubscription(receipt: string, productId: string): SubscriptionInfo | null;
42
+ export declare function mockValidateGoogleProduct(receipt: string, productId: string): {
43
+ transactionId: string;
44
+ purchasedAt: string;
45
+ } | null;
46
+ //# sourceMappingURL=mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/providers/mock.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIvD;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,CAAC;AAE9B,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAYvE;AAwBD,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAetF;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,iBAAiB,CAAC,EAAE,MAAM,GACzB;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAS1E;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,gBAAgB,GAAG,IAAI,CAezB;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAOvD"}
@@ -0,0 +1,93 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { SUBSCRIPTION_STATUS, MOCK_RECEIPT_PREFIX } from '@onesub/shared';
3
+ import { log } from '../logger.js';
4
+ export function classifyMockReceipt(receipt) {
5
+ if (receipt.startsWith(MOCK_RECEIPT_PREFIX.NETWORK_ERROR))
6
+ return { kind: 'network-error' };
7
+ if (receipt.startsWith(MOCK_RECEIPT_PREFIX.REVOKED))
8
+ return { kind: 'revoked' };
9
+ if (receipt.startsWith(MOCK_RECEIPT_PREFIX.EXPIRED))
10
+ return { kind: 'expired' };
11
+ if (receipt.startsWith(MOCK_RECEIPT_PREFIX.INVALID) ||
12
+ receipt.startsWith(MOCK_RECEIPT_PREFIX.BAD_SIG)) {
13
+ return { kind: 'invalid' };
14
+ }
15
+ if (receipt.startsWith(MOCK_RECEIPT_PREFIX.SANDBOX))
16
+ return { kind: 'sandbox' };
17
+ return { kind: 'valid' };
18
+ }
19
+ /**
20
+ * Gate the outcome against `valid` / `sandbox`. Throws for network-error,
21
+ * logs + returns false for rejection cases, returns true for pass-through.
22
+ * Every mock validator uses this so their rejection behavior stays in sync.
23
+ */
24
+ function outcomePasses(outcome, tag) {
25
+ if (outcome.kind === 'network-error') {
26
+ throw new Error(`[onesub/mock/${tag}] simulated upstream network error`);
27
+ }
28
+ if (outcome.kind === 'valid' || outcome.kind === 'sandbox')
29
+ return true;
30
+ log.warn(`[onesub/mock/${tag}] receipt rejected`, { outcome: outcome.kind });
31
+ return false;
32
+ }
33
+ function deterministicTransactionId(prefix, receipt) {
34
+ const digest = createHash('sha256').update(receipt).digest('hex').slice(0, 24);
35
+ return `${prefix}_${digest}`;
36
+ }
37
+ const HOURS = 60 * 60 * 1000;
38
+ const DAYS = 24 * HOURS;
39
+ export function mockValidateAppleSubscription(receipt) {
40
+ const outcome = classifyMockReceipt(receipt);
41
+ if (!outcomePasses(outcome, 'apple'))
42
+ return null;
43
+ const now = Date.now();
44
+ const expiresAt = outcome.kind === 'sandbox' ? now + 1 * HOURS : now + 30 * DAYS;
45
+ return {
46
+ userId: '',
47
+ productId: 'mock_subscription',
48
+ platform: 'apple',
49
+ status: SUBSCRIPTION_STATUS.ACTIVE,
50
+ expiresAt: new Date(expiresAt).toISOString(),
51
+ originalTransactionId: deterministicTransactionId('mock_apple_orig', receipt),
52
+ purchasedAt: new Date(now).toISOString(),
53
+ willRenew: true,
54
+ };
55
+ }
56
+ export function mockValidateAppleProduct(receipt, expectedProductId) {
57
+ const outcome = classifyMockReceipt(receipt);
58
+ if (!outcomePasses(outcome, 'apple'))
59
+ return null;
60
+ const productId = expectedProductId ?? 'mock_product';
61
+ return {
62
+ transactionId: deterministicTransactionId(`mock_apple_${productId}`, receipt),
63
+ productId,
64
+ purchasedAt: new Date().toISOString(),
65
+ };
66
+ }
67
+ export function mockValidateGoogleSubscription(receipt, productId) {
68
+ const outcome = classifyMockReceipt(receipt);
69
+ if (!outcomePasses(outcome, 'google'))
70
+ return null;
71
+ const now = Date.now();
72
+ const expiresAt = outcome.kind === 'sandbox' ? now + 1 * HOURS : now + 30 * DAYS;
73
+ return {
74
+ userId: '',
75
+ productId,
76
+ platform: 'google',
77
+ status: SUBSCRIPTION_STATUS.ACTIVE,
78
+ expiresAt: new Date(expiresAt).toISOString(),
79
+ originalTransactionId: deterministicTransactionId('mock_google_orig', receipt),
80
+ purchasedAt: new Date(now).toISOString(),
81
+ willRenew: true,
82
+ };
83
+ }
84
+ export function mockValidateGoogleProduct(receipt, productId) {
85
+ const outcome = classifyMockReceipt(receipt);
86
+ if (!outcomePasses(outcome, 'google'))
87
+ return null;
88
+ return {
89
+ transactionId: deterministicTransactionId(`mock_google_${productId}`, receipt),
90
+ purchasedAt: new Date().toISOString(),
91
+ };
92
+ }
93
+ //# sourceMappingURL=mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/providers/mock.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/routes/admin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,KAAK,EAAE,kBAAkB,EAAgB,MAAM,gBAAgB,CAAC;AAEvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKjD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,kBAAkB,EAC1B,aAAa,EAAE,aAAa,GAC3B,MAAM,GAAG,IAAI,CAmGf"}
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/routes/admin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,KAAK,EAAE,kBAAkB,EAAgB,MAAM,gBAAgB,CAAC;AAEvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKjD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,kBAAkB,EAC1B,aAAa,EAAE,aAAa,GAC3B,MAAM,GAAG,IAAI,CAqGf"}
@@ -21,8 +21,10 @@ export function createAdminRouter(config, purchaseStore) {
21
21
  return null;
22
22
  const router = Router();
23
23
  const adminSecret = config.adminSecret;
24
- // Auth middleware — reject any admin request without matching secret
25
- router.use((req, res, next) => {
24
+ // Auth middleware — scoped to /onesub/purchase/admin/* so it doesn't
25
+ // swallow unrelated requests (e.g. host-app routes like /health) when the
26
+ // admin router is mounted at the parent root.
27
+ router.use('/onesub/purchase/admin', (req, res, next) => {
26
28
  const provided = req.headers[ADMIN_SECRET_HEADER];
27
29
  if (typeof provided !== 'string' || provided !== adminSecret) {
28
30
  sendError(res, 401, ONESUB_ERROR_CODE.INVALID_ADMIN_SECRET, 'INVALID_ADMIN_SECRET');
@@ -1 +1 @@
1
- {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/routes/admin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/routes/admin.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"purchase.d.ts","sourceRoot":"","sources":["../../src/routes/purchase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,KAAK,EAIV,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAqBjD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,kBAAkB,EAC1B,aAAa,EAAE,aAAa,GAC3B,MAAM,CAwLR"}
1
+ {"version":3,"file":"purchase.d.ts","sourceRoot":"","sources":["../../src/routes/purchase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,KAAK,EAIV,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAyBjD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,kBAAkB,EAC1B,aAAa,EAAE,aAAa,GAC3B,MAAM,CAgMR"}
@@ -2,7 +2,7 @@ import { Router } from 'express';
2
2
  import { z } from 'zod';
3
3
  import { ROUTES, PURCHASE_TYPE, ONESUB_ERROR_CODE } from '@onesub/shared';
4
4
  import { validateAppleConsumableReceipt } from '../providers/apple.js';
5
- import { validateGoogleProductReceipt, consumeGoogleProductReceipt } from '../providers/google.js';
5
+ import { validateGoogleProductReceipt, consumeGoogleProductReceipt, acknowledgeGoogleProduct, } from '../providers/google.js';
6
6
  import { log } from '../logger.js';
7
7
  import { sendError, sendZodError } from '../errors.js';
8
8
  const NO_PURCHASE = { valid: false, purchase: null };
@@ -124,11 +124,20 @@ export function createPurchaseRouter(config, purchaseStore) {
124
124
  quantity: 1,
125
125
  };
126
126
  await purchaseStore.savePurchase(purchase);
127
- // For Google consumables: acknowledge the purchase after the entitlement is saved.
128
- // Must happen after savePurchase — if called before, a DB failure would leave the
129
- // receipt consumed but the entitlement ungranted with no retry path.
130
- if (platform === 'google' && type === PURCHASE_TYPE.CONSUMABLE && config.google) {
131
- void consumeGoogleProductReceipt(receipt, productId, config.google);
127
+ // Google requires acknowledgement within 3 days of purchase or the
128
+ // transaction is auto-refunded.
129
+ // - Consumables: :consume implicitly acknowledges, so consume is enough.
130
+ // - Non-consumables: must call :acknowledge explicitly.
131
+ // Both must run after savePurchase — if called before, a DB failure would
132
+ // leave the receipt acknowledged/consumed but the entitlement ungranted
133
+ // with no retry path.
134
+ if (platform === 'google' && config.google) {
135
+ if (type === PURCHASE_TYPE.CONSUMABLE) {
136
+ void consumeGoogleProductReceipt(receipt, productId, config.google);
137
+ }
138
+ else {
139
+ void acknowledgeGoogleProduct(receipt, productId, config.google);
140
+ }
132
141
  }
133
142
  const response = {
134
143
  valid: true,