@onesub/server 0.12.0 → 0.12.1

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 (120) hide show
  1. package/dist/__tests__/webhook-apple.test.d.ts +12 -0
  2. package/dist/__tests__/webhook-apple.test.d.ts.map +1 -0
  3. package/dist/__tests__/webhook-google.test.d.ts +13 -0
  4. package/dist/__tests__/webhook-google.test.d.ts.map +1 -0
  5. package/dist/index.cjs +258 -288
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.d.ts +0 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +259 -286
  10. package/dist/index.js.map +1 -1
  11. package/dist/providers/google.d.ts.map +1 -1
  12. package/dist/routes/webhook-apple.d.ts +6 -0
  13. package/dist/routes/webhook-apple.d.ts.map +1 -0
  14. package/dist/routes/webhook-google.d.ts +7 -0
  15. package/dist/routes/webhook-google.d.ts.map +1 -0
  16. package/dist/routes/webhook.d.ts +4 -17
  17. package/dist/routes/webhook.d.ts.map +1 -1
  18. package/package.json +2 -2
  19. package/dist/__tests__/admin-customer-detail.test.js +0 -146
  20. package/dist/__tests__/admin-customer-detail.test.js.map +0 -1
  21. package/dist/__tests__/admin-list-subscriptions.test.js +0 -192
  22. package/dist/__tests__/admin-list-subscriptions.test.js.map +0 -1
  23. package/dist/__tests__/admin-subscription-detail.test.js +0 -112
  24. package/dist/__tests__/admin-subscription-detail.test.js.map +0 -1
  25. package/dist/__tests__/apple-root-ca.test.js +0 -41
  26. package/dist/__tests__/apple-root-ca.test.js.map +0 -1
  27. package/dist/__tests__/apple-status-api.test.js +0 -345
  28. package/dist/__tests__/apple-status-api.test.js.map +0 -1
  29. package/dist/__tests__/cache.test.js +0 -34
  30. package/dist/__tests__/cache.test.js.map +0 -1
  31. package/dist/__tests__/entitlements.test.js +0 -268
  32. package/dist/__tests__/entitlements.test.js.map +0 -1
  33. package/dist/__tests__/error-codes.test.js +0 -168
  34. package/dist/__tests__/error-codes.test.js.map +0 -1
  35. package/dist/__tests__/fetch-hardening.test.js +0 -192
  36. package/dist/__tests__/fetch-hardening.test.js.map +0 -1
  37. package/dist/__tests__/google-paused.test.js +0 -126
  38. package/dist/__tests__/google-paused.test.js.map +0 -1
  39. package/dist/__tests__/google-price-change.test.js +0 -186
  40. package/dist/__tests__/google-price-change.test.js.map +0 -1
  41. package/dist/__tests__/google-subscriptions-v2.test.js +0 -206
  42. package/dist/__tests__/google-subscriptions-v2.test.js.map +0 -1
  43. package/dist/__tests__/lifecycle-scenarios.test.js +0 -579
  44. package/dist/__tests__/lifecycle-scenarios.test.js.map +0 -1
  45. package/dist/__tests__/lifecycle-states.test.js +0 -423
  46. package/dist/__tests__/lifecycle-states.test.js.map +0 -1
  47. package/dist/__tests__/linked-purchase-token.test.js +0 -227
  48. package/dist/__tests__/linked-purchase-token.test.js.map +0 -1
  49. package/dist/__tests__/metrics.test.js +0 -340
  50. package/dist/__tests__/metrics.test.js.map +0 -1
  51. package/dist/__tests__/mock-provider.test.js +0 -188
  52. package/dist/__tests__/mock-provider.test.js.map +0 -1
  53. package/dist/__tests__/openapi.test.js +0 -32
  54. package/dist/__tests__/openapi.test.js.map +0 -1
  55. package/dist/__tests__/paused-auto-resume.test.js +0 -162
  56. package/dist/__tests__/paused-auto-resume.test.js.map +0 -1
  57. package/dist/__tests__/providers.test.js +0 -321
  58. package/dist/__tests__/providers.test.js.map +0 -1
  59. package/dist/__tests__/redis-store.test.js +0 -117
  60. package/dist/__tests__/redis-store.test.js.map +0 -1
  61. package/dist/__tests__/refund-policy.test.js +0 -317
  62. package/dist/__tests__/refund-policy.test.js.map +0 -1
  63. package/dist/__tests__/schema.test.js +0 -46
  64. package/dist/__tests__/schema.test.js.map +0 -1
  65. package/dist/__tests__/store.test.js +0 -172
  66. package/dist/__tests__/store.test.js.map +0 -1
  67. package/dist/__tests__/test-utils.js +0 -30
  68. package/dist/__tests__/test-utils.js.map +0 -1
  69. package/dist/__tests__/webhook-events.test.js +0 -36
  70. package/dist/__tests__/webhook-events.test.js.map +0 -1
  71. package/dist/__tests__/webhook-queue.test.js +0 -26
  72. package/dist/__tests__/webhook-queue.test.js.map +0 -1
  73. package/dist/__tests__/webhook-refund.test.js +0 -313
  74. package/dist/__tests__/webhook-refund.test.js.map +0 -1
  75. package/dist/cache.js +0 -43
  76. package/dist/cache.js.map +0 -1
  77. package/dist/errors.js +0 -19
  78. package/dist/errors.js.map +0 -1
  79. package/dist/http.js +0 -36
  80. package/dist/http.js.map +0 -1
  81. package/dist/logger.js +0 -20
  82. package/dist/logger.js.map +0 -1
  83. package/dist/openapi.js +0 -196
  84. package/dist/openapi.js.map +0 -1
  85. package/dist/providers/apple-root-ca.js +0 -38
  86. package/dist/providers/apple-root-ca.js.map +0 -1
  87. package/dist/providers/apple.js +0 -510
  88. package/dist/providers/apple.js.map +0 -1
  89. package/dist/providers/google.js +0 -522
  90. package/dist/providers/google.js.map +0 -1
  91. package/dist/providers/mock.js +0 -93
  92. package/dist/providers/mock.js.map +0 -1
  93. package/dist/routes/admin.js +0 -287
  94. package/dist/routes/admin.js.map +0 -1
  95. package/dist/routes/entitlements.js +0 -130
  96. package/dist/routes/entitlements.js.map +0 -1
  97. package/dist/routes/metrics.js +0 -281
  98. package/dist/routes/metrics.js.map +0 -1
  99. package/dist/routes/purchase.js +0 -187
  100. package/dist/routes/purchase.js.map +0 -1
  101. package/dist/routes/status.js +0 -55
  102. package/dist/routes/status.js.map +0 -1
  103. package/dist/routes/validate.js +0 -70
  104. package/dist/routes/validate.js.map +0 -1
  105. package/dist/routes/webhook.js +0 -461
  106. package/dist/routes/webhook.js.map +0 -1
  107. package/dist/store.js +0 -145
  108. package/dist/store.js.map +0 -1
  109. package/dist/stores/postgres.js +0 -329
  110. package/dist/stores/postgres.js.map +0 -1
  111. package/dist/stores/redis.js +0 -255
  112. package/dist/stores/redis.js.map +0 -1
  113. package/dist/stores/schema.js +0 -67
  114. package/dist/stores/schema.js.map +0 -1
  115. package/dist/tracing.js +0 -74
  116. package/dist/tracing.js.map +0 -1
  117. package/dist/webhook-events.js +0 -57
  118. package/dist/webhook-events.js.map +0 -1
  119. package/dist/webhook-queue.js +0 -108
  120. package/dist/webhook-queue.js.map +0 -1
@@ -1,206 +0,0 @@
1
- /**
2
- * Tests for the validateGoogleReceipt v1 → v2 migration.
3
- *
4
- * Covers:
5
- * - Calls purchases.subscriptionsv2 endpoint (no productId in URL)
6
- * - subscriptionState string enum → onesub SubscriptionStatus mapping
7
- * - lineItems productId match (success / mismatch)
8
- * - autoRenewingPlan.autoRenewEnabled → willRenew
9
- * - latestOrderId → originalTransactionId
10
- * - PENDING / UNSPECIFIED states rejected (return null)
11
- */
12
- import { describe, it, expect, beforeAll, beforeEach, vi } from 'vitest';
13
- import { generateKeyPairSync } from 'crypto';
14
- import { validateGoogleReceipt } from '../providers/google.js';
15
- import { SUBSCRIPTION_STATUS } from '@onesub/shared';
16
- import { urlHost } from './test-utils.js';
17
- // ── helpers ─────────────────────────────────────────────────────────────────
18
- let testPrivateKey;
19
- beforeAll(() => {
20
- const { privateKey } = generateKeyPairSync('rsa', { modulusLength: 2048 });
21
- testPrivateKey = privateKey.export({ type: 'pkcs8', format: 'pem' });
22
- });
23
- beforeEach(() => {
24
- vi.restoreAllMocks();
25
- });
26
- function makeGoogleConfig() {
27
- return {
28
- packageName: 'com.example.app',
29
- serviceAccountKey: JSON.stringify({
30
- client_email: `test-${Math.random()}@test.iam.gserviceaccount.com`,
31
- private_key: testPrivateKey,
32
- token_uri: 'https://oauth2.googleapis.com/token',
33
- }),
34
- };
35
- }
36
- function mockV2Fetch(responseBody, opts) {
37
- const calls = [];
38
- vi.spyOn(global, 'fetch').mockImplementation(async (url) => {
39
- if (urlHost(url) === 'oauth2.googleapis.com') {
40
- return {
41
- ok: true,
42
- json: async () => ({ access_token: 'tok', expires_in: 3600 }),
43
- text: async () => '',
44
- };
45
- }
46
- calls.push({ url: String(url) });
47
- return {
48
- ok: (opts?.status ?? 200) < 400,
49
- status: opts?.status ?? 200,
50
- json: async () => responseBody,
51
- text: async () => JSON.stringify(responseBody),
52
- };
53
- });
54
- return calls;
55
- }
56
- function v2Active(productId = 'pro_monthly') {
57
- return {
58
- startTime: '2026-01-01T00:00:00Z',
59
- subscriptionState: 'SUBSCRIPTION_STATE_ACTIVE',
60
- latestOrderId: 'GPA.1234-5678-9012-12345',
61
- acknowledgementState: 'ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED',
62
- lineItems: [{
63
- productId,
64
- expiryTime: '2027-01-01T00:00:00Z',
65
- autoRenewingPlan: { autoRenewEnabled: true },
66
- }],
67
- };
68
- }
69
- // ── URL shape ───────────────────────────────────────────────────────────────
70
- describe('validateGoogleReceipt — v2 endpoint', () => {
71
- it('calls purchases.subscriptionsv2 (token only, no productId in URL)', async () => {
72
- const calls = mockV2Fetch(v2Active('pro_monthly'));
73
- await validateGoogleReceipt('purchase_token_xyz', 'pro_monthly', makeGoogleConfig());
74
- const apiCall = calls.find((c) => urlHost(c.url) === 'androidpublisher.googleapis.com');
75
- expect(apiCall).toBeDefined();
76
- expect(apiCall?.url).toContain('/purchases/subscriptionsv2/tokens/purchase_token_xyz');
77
- expect(apiCall?.url).not.toContain('/purchases/subscriptions/');
78
- });
79
- });
80
- // ── subscriptionState mapping ───────────────────────────────────────────────
81
- describe('validateGoogleReceipt — subscriptionState mapping', () => {
82
- const cases = [
83
- ['SUBSCRIPTION_STATE_ACTIVE', SUBSCRIPTION_STATUS.ACTIVE],
84
- ['SUBSCRIPTION_STATE_IN_GRACE_PERIOD', SUBSCRIPTION_STATUS.GRACE_PERIOD],
85
- ['SUBSCRIPTION_STATE_ON_HOLD', SUBSCRIPTION_STATUS.ON_HOLD],
86
- ['SUBSCRIPTION_STATE_PAUSED', SUBSCRIPTION_STATUS.PAUSED],
87
- ['SUBSCRIPTION_STATE_CANCELED', SUBSCRIPTION_STATUS.CANCELED],
88
- ['SUBSCRIPTION_STATE_EXPIRED', SUBSCRIPTION_STATUS.EXPIRED],
89
- ];
90
- for (const [state, expected] of cases) {
91
- it(`${state} → ${expected}`, async () => {
92
- mockV2Fetch({ ...v2Active('pro_monthly'), subscriptionState: state });
93
- const result = await validateGoogleReceipt('tok', 'pro_monthly', makeGoogleConfig());
94
- expect(result?.status).toBe(expected);
95
- });
96
- }
97
- it('SUBSCRIPTION_STATE_PENDING → null (entitlement not yet granted)', async () => {
98
- mockV2Fetch({ ...v2Active('pro_monthly'), subscriptionState: 'SUBSCRIPTION_STATE_PENDING' });
99
- const result = await validateGoogleReceipt('tok', 'pro_monthly', makeGoogleConfig());
100
- expect(result).toBeNull();
101
- });
102
- it('SUBSCRIPTION_STATE_UNSPECIFIED → null', async () => {
103
- mockV2Fetch({ ...v2Active('pro_monthly'), subscriptionState: 'SUBSCRIPTION_STATE_UNSPECIFIED' });
104
- const result = await validateGoogleReceipt('tok', 'pro_monthly', makeGoogleConfig());
105
- expect(result).toBeNull();
106
- });
107
- it('unknown state string → null', async () => {
108
- mockV2Fetch({ ...v2Active('pro_monthly'), subscriptionState: 'SOMETHING_NEW_FROM_GOOGLE' });
109
- const result = await validateGoogleReceipt('tok', 'pro_monthly', makeGoogleConfig());
110
- expect(result).toBeNull();
111
- });
112
- });
113
- // ── lineItems productId matching ────────────────────────────────────────────
114
- describe('validateGoogleReceipt — lineItems productId match', () => {
115
- it('returns null when no lineItem matches the requested productId', async () => {
116
- mockV2Fetch(v2Active('different_product'));
117
- const result = await validateGoogleReceipt('tok', 'pro_monthly', makeGoogleConfig());
118
- expect(result).toBeNull();
119
- });
120
- it('returns null when lineItems is empty', async () => {
121
- mockV2Fetch({ ...v2Active(), lineItems: [] });
122
- const result = await validateGoogleReceipt('tok', 'pro_monthly', makeGoogleConfig());
123
- expect(result).toBeNull();
124
- });
125
- it('picks the matching lineItem when multiple are present (multi-product)', async () => {
126
- mockV2Fetch({
127
- ...v2Active(),
128
- lineItems: [
129
- { productId: 'addon_a', expiryTime: '2099-01-01T00:00:00Z', autoRenewingPlan: { autoRenewEnabled: true } },
130
- { productId: 'pro_monthly', expiryTime: '2027-06-01T00:00:00Z', autoRenewingPlan: { autoRenewEnabled: true } },
131
- { productId: 'addon_b', expiryTime: '2099-12-31T00:00:00Z', autoRenewingPlan: { autoRenewEnabled: false } },
132
- ],
133
- });
134
- const result = await validateGoogleReceipt('tok', 'pro_monthly', makeGoogleConfig());
135
- expect(result).not.toBeNull();
136
- expect(result?.productId).toBe('pro_monthly');
137
- expect(result?.expiresAt).toBe('2027-06-01T00:00:00Z');
138
- expect(result?.willRenew).toBe(true);
139
- });
140
- });
141
- // ── field mapping ───────────────────────────────────────────────────────────
142
- describe('validateGoogleReceipt — field mapping', () => {
143
- it('uses latestOrderId as originalTransactionId', async () => {
144
- mockV2Fetch({ ...v2Active('pro_monthly'), latestOrderId: 'GPA.canonical-order-id' });
145
- const result = await validateGoogleReceipt('tok', 'pro_monthly', makeGoogleConfig());
146
- expect(result?.originalTransactionId).toBe('GPA.canonical-order-id');
147
- });
148
- it('falls back to truncated purchaseToken when latestOrderId is absent', async () => {
149
- const noOrder = v2Active('pro_monthly');
150
- delete noOrder.latestOrderId;
151
- mockV2Fetch(noOrder);
152
- const result = await validateGoogleReceipt('a-very-very-long-token-' + 'x'.repeat(100), 'pro_monthly', makeGoogleConfig());
153
- expect(result?.originalTransactionId).toBeDefined();
154
- expect(result?.originalTransactionId.length).toBeLessThanOrEqual(64);
155
- });
156
- it('autoRenewEnabled false → willRenew false', async () => {
157
- mockV2Fetch({
158
- ...v2Active(),
159
- lineItems: [{
160
- productId: 'pro_monthly',
161
- expiryTime: '2027-01-01T00:00:00Z',
162
- autoRenewingPlan: { autoRenewEnabled: false },
163
- }],
164
- });
165
- const result = await validateGoogleReceipt('tok', 'pro_monthly', makeGoogleConfig());
166
- expect(result?.willRenew).toBe(false);
167
- });
168
- it('missing autoRenewingPlan → willRenew false', async () => {
169
- mockV2Fetch({
170
- ...v2Active(),
171
- lineItems: [{ productId: 'pro_monthly', expiryTime: '2027-01-01T00:00:00Z' }],
172
- });
173
- const result = await validateGoogleReceipt('tok', 'pro_monthly', makeGoogleConfig());
174
- expect(result?.willRenew).toBe(false);
175
- });
176
- it('uses lineItem.expiryTime for expiresAt and startTime for purchasedAt', async () => {
177
- mockV2Fetch({
178
- startTime: '2025-12-01T10:00:00Z',
179
- subscriptionState: 'SUBSCRIPTION_STATE_ACTIVE',
180
- latestOrderId: 'GPA.x',
181
- lineItems: [{
182
- productId: 'pro_monthly',
183
- expiryTime: '2026-12-01T10:00:00Z',
184
- autoRenewingPlan: { autoRenewEnabled: true },
185
- }],
186
- });
187
- const result = await validateGoogleReceipt('tok', 'pro_monthly', makeGoogleConfig());
188
- expect(result?.purchasedAt).toBe('2025-12-01T10:00:00Z');
189
- expect(result?.expiresAt).toBe('2026-12-01T10:00:00Z');
190
- });
191
- });
192
- // ── error paths ─────────────────────────────────────────────────────────────
193
- describe('validateGoogleReceipt — error paths', () => {
194
- it('returns null on Play API error response', async () => {
195
- mockV2Fetch({}, { status: 410 });
196
- const result = await validateGoogleReceipt('tok', 'pro_monthly', makeGoogleConfig());
197
- expect(result).toBeNull();
198
- });
199
- it('returns null when serviceAccountKey is missing', async () => {
200
- const fetchSpy = vi.spyOn(global, 'fetch');
201
- const result = await validateGoogleReceipt('tok', 'pro_monthly', { packageName: 'com.example.app' });
202
- expect(result).toBeNull();
203
- expect(fetchSpy).not.toHaveBeenCalled();
204
- });
205
- });
206
- //# sourceMappingURL=google-subscriptions-v2.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"google-subscriptions-v2.test.js","sourceRoot":"","sources":["../../src/__tests__/google-subscriptions-v2.test.ts"],"names":[],"mappings":"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"}