@onesub/server 0.7.3 → 0.9.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/dist/__tests__/apple-status-api.test.d.ts +14 -0
  2. package/dist/__tests__/apple-status-api.test.d.ts.map +1 -0
  3. package/dist/__tests__/apple-status-api.test.js +345 -0
  4. package/dist/__tests__/apple-status-api.test.js.map +1 -0
  5. package/dist/__tests__/fetch-hardening.test.d.ts +7 -0
  6. package/dist/__tests__/fetch-hardening.test.d.ts.map +1 -0
  7. package/dist/__tests__/fetch-hardening.test.js +192 -0
  8. package/dist/__tests__/fetch-hardening.test.js.map +1 -0
  9. package/dist/__tests__/google-paused.test.d.ts +10 -0
  10. package/dist/__tests__/google-paused.test.d.ts.map +1 -0
  11. package/dist/__tests__/google-paused.test.js +126 -0
  12. package/dist/__tests__/google-paused.test.js.map +1 -0
  13. package/dist/__tests__/google-price-change.test.d.ts +6 -0
  14. package/dist/__tests__/google-price-change.test.d.ts.map +1 -0
  15. package/dist/__tests__/google-price-change.test.js +186 -0
  16. package/dist/__tests__/google-price-change.test.js.map +1 -0
  17. package/dist/__tests__/google-subscriptions-v2.test.d.ts +13 -0
  18. package/dist/__tests__/google-subscriptions-v2.test.d.ts.map +1 -0
  19. package/dist/__tests__/google-subscriptions-v2.test.js +206 -0
  20. package/dist/__tests__/google-subscriptions-v2.test.js.map +1 -0
  21. package/dist/__tests__/lifecycle-states.test.d.ts +12 -0
  22. package/dist/__tests__/lifecycle-states.test.d.ts.map +1 -0
  23. package/dist/__tests__/lifecycle-states.test.js +423 -0
  24. package/dist/__tests__/lifecycle-states.test.js.map +1 -0
  25. package/dist/__tests__/linked-purchase-token.test.d.ts +9 -0
  26. package/dist/__tests__/linked-purchase-token.test.d.ts.map +1 -0
  27. package/dist/__tests__/linked-purchase-token.test.js +227 -0
  28. package/dist/__tests__/linked-purchase-token.test.js.map +1 -0
  29. package/dist/__tests__/paused-auto-resume.test.d.ts +7 -0
  30. package/dist/__tests__/paused-auto-resume.test.d.ts.map +1 -0
  31. package/dist/__tests__/paused-auto-resume.test.js +162 -0
  32. package/dist/__tests__/paused-auto-resume.test.js.map +1 -0
  33. package/dist/__tests__/providers.test.js +69 -9
  34. package/dist/__tests__/providers.test.js.map +1 -1
  35. package/dist/__tests__/refund-policy.test.d.ts +11 -0
  36. package/dist/__tests__/refund-policy.test.d.ts.map +1 -0
  37. package/dist/__tests__/refund-policy.test.js +317 -0
  38. package/dist/__tests__/refund-policy.test.js.map +1 -0
  39. package/dist/__tests__/schema.test.js +4 -0
  40. package/dist/__tests__/schema.test.js.map +1 -1
  41. package/dist/__tests__/store.test.js +17 -0
  42. package/dist/__tests__/store.test.js.map +1 -1
  43. package/dist/__tests__/test-utils.d.ts +20 -0
  44. package/dist/__tests__/test-utils.d.ts.map +1 -0
  45. package/dist/__tests__/test-utils.js +30 -0
  46. package/dist/__tests__/test-utils.js.map +1 -0
  47. package/dist/__tests__/webhook-refund.test.d.ts +13 -0
  48. package/dist/__tests__/webhook-refund.test.d.ts.map +1 -0
  49. package/dist/__tests__/webhook-refund.test.js +313 -0
  50. package/dist/__tests__/webhook-refund.test.js.map +1 -0
  51. package/dist/http.d.ts +17 -0
  52. package/dist/http.d.ts.map +1 -0
  53. package/dist/http.js +36 -0
  54. package/dist/http.js.map +1 -0
  55. package/dist/index.d.ts +1 -1
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +2 -2
  58. package/dist/index.js.map +1 -1
  59. package/dist/providers/apple.d.ts +50 -2
  60. package/dist/providers/apple.d.ts.map +1 -1
  61. package/dist/providers/apple.js +235 -2
  62. package/dist/providers/apple.js.map +1 -1
  63. package/dist/providers/google.d.ts +71 -6
  64. package/dist/providers/google.d.ts.map +1 -1
  65. package/dist/providers/google.js +211 -36
  66. package/dist/providers/google.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 +14 -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 +7 -0
  90. package/dist/stores/schema.js.map +1 -1
  91. package/package.json +2 -2
  92. package/sql/schema.sql +7 -0
@@ -0,0 +1,313 @@
1
+ /**
2
+ * Refund / voided-purchase webhook tests.
3
+ *
4
+ * Covers:
5
+ * - Apple webhook REFUND for IAP (Consumable / Non-Consumable) →
6
+ * PurchaseStore row removed, SubscriptionStore untouched.
7
+ * - Apple webhook REFUND for subscriptions still updates SubscriptionStore.
8
+ * - Google voidedPurchaseNotification productType=2 → IAP row removed.
9
+ * - Google voidedPurchaseNotification productType=1 → subscription canceled.
10
+ * - decodeGoogleVoidedNotification recognises voided payload, ignores other kinds.
11
+ */
12
+ import { describe, it, expect, beforeEach } from 'vitest';
13
+ import express from 'express';
14
+ import { SUBSCRIPTION_STATUS } from '@onesub/shared';
15
+ import { createWebhookRouter } from '../routes/webhook.js';
16
+ import { InMemorySubscriptionStore, InMemoryPurchaseStore } from '../store.js';
17
+ import { decodeGoogleVoidedNotification } from '../providers/google.js';
18
+ // ── helpers ─────────────────────────────────────────────────────────────────
19
+ function makeJws(payload) {
20
+ const header = Buffer.from(JSON.stringify({ alg: 'ES256' })).toString('base64url');
21
+ const body = Buffer.from(JSON.stringify(payload)).toString('base64url');
22
+ return `${header}.${body}.fakesig`;
23
+ }
24
+ function appleConfig() {
25
+ return {
26
+ apple: { bundleId: 'com.example.app', skipJwsVerification: true },
27
+ database: { url: '' },
28
+ };
29
+ }
30
+ function googleConfig() {
31
+ return {
32
+ google: { packageName: 'com.example.app' },
33
+ database: { url: '' },
34
+ };
35
+ }
36
+ function buildServer(config, store, purchaseStore) {
37
+ const app = express();
38
+ app.use(express.json());
39
+ app.use(createWebhookRouter(config, store, purchaseStore));
40
+ return {
41
+ async request(path, body) {
42
+ // Use Node http directly for a lightweight test server.
43
+ const server = app.listen(0);
44
+ const address = server.address();
45
+ const port = typeof address === 'object' && address ? address.port : 0;
46
+ try {
47
+ const resp = await fetch(`http://127.0.0.1:${port}${path}`, {
48
+ method: 'POST',
49
+ headers: { 'Content-Type': 'application/json' },
50
+ body: JSON.stringify(body),
51
+ });
52
+ const text = await resp.text();
53
+ let parsed = text;
54
+ try {
55
+ parsed = JSON.parse(text);
56
+ }
57
+ catch { /* keep as text */ }
58
+ return { status: resp.status, body: parsed };
59
+ }
60
+ finally {
61
+ await new Promise((resolve) => server.close(() => resolve()));
62
+ }
63
+ },
64
+ };
65
+ }
66
+ const samplePurchase = (overrides) => ({
67
+ userId: 'user_1',
68
+ productId: 'credits_100',
69
+ platform: 'apple',
70
+ type: 'consumable',
71
+ transactionId: 'txn_apple_consumable_001',
72
+ purchasedAt: '2026-01-01T00:00:00.000Z',
73
+ quantity: 1,
74
+ ...overrides,
75
+ });
76
+ const sampleSub = (overrides) => ({
77
+ userId: 'user_sub',
78
+ productId: 'pro_monthly',
79
+ platform: 'google',
80
+ status: 'active',
81
+ expiresAt: '2027-01-01T00:00:00.000Z',
82
+ originalTransactionId: 'token_google_sub_xyz',
83
+ purchasedAt: '2026-01-01T00:00:00.000Z',
84
+ willRenew: true,
85
+ ...overrides,
86
+ });
87
+ // ── Apple webhook: IAP REFUND ───────────────────────────────────────────────
88
+ describe('Apple webhook — IAP REFUND', () => {
89
+ let store;
90
+ let purchaseStore;
91
+ let server;
92
+ beforeEach(() => {
93
+ store = new InMemorySubscriptionStore();
94
+ purchaseStore = new InMemoryPurchaseStore();
95
+ server = buildServer(appleConfig(), store, purchaseStore);
96
+ });
97
+ it('removes the consumable purchase row on REFUND', async () => {
98
+ await purchaseStore.savePurchase(samplePurchase({ transactionId: 'txn_consumable_a' }));
99
+ const signedTransactionInfo = makeJws({
100
+ bundleId: 'com.example.app',
101
+ type: 'Consumable',
102
+ productId: 'credits_100',
103
+ transactionId: 'txn_consumable_a',
104
+ originalTransactionId: 'orig_consumable_a',
105
+ purchaseDate: Date.now(),
106
+ });
107
+ const signedRenewalInfo = makeJws({});
108
+ const signedPayload = makeJws({
109
+ notificationType: 'REFUND',
110
+ data: { signedTransactionInfo, signedRenewalInfo },
111
+ });
112
+ const resp = await server.request('/onesub/webhook/apple', { signedPayload });
113
+ expect(resp.status).toBe(200);
114
+ expect(await purchaseStore.getPurchaseByTransactionId('txn_consumable_a')).toBeNull();
115
+ });
116
+ it('removes the non-consumable purchase row on REVOKE', async () => {
117
+ await purchaseStore.savePurchase(samplePurchase({
118
+ transactionId: 'txn_nc_a',
119
+ type: 'non_consumable',
120
+ productId: 'premium_unlock',
121
+ }));
122
+ const signedTransactionInfo = makeJws({
123
+ bundleId: 'com.example.app',
124
+ type: 'Non-Consumable',
125
+ productId: 'premium_unlock',
126
+ transactionId: 'txn_nc_a',
127
+ originalTransactionId: 'txn_nc_a',
128
+ purchaseDate: Date.now(),
129
+ });
130
+ const signedPayload = makeJws({
131
+ notificationType: 'REVOKE',
132
+ data: { signedTransactionInfo, signedRenewalInfo: makeJws({}) },
133
+ });
134
+ const resp = await server.request('/onesub/webhook/apple', { signedPayload });
135
+ expect(resp.status).toBe(200);
136
+ expect(await purchaseStore.getPurchaseByTransactionId('txn_nc_a')).toBeNull();
137
+ });
138
+ it('does not touch the SubscriptionStore on IAP REFUND', async () => {
139
+ await store.save(sampleSub({ originalTransactionId: 'orig_sub_untouched' }));
140
+ await purchaseStore.savePurchase(samplePurchase({ transactionId: 'iap_only' }));
141
+ const signedTransactionInfo = makeJws({
142
+ bundleId: 'com.example.app',
143
+ type: 'Consumable',
144
+ productId: 'credits_100',
145
+ transactionId: 'iap_only',
146
+ originalTransactionId: 'iap_only',
147
+ purchaseDate: Date.now(),
148
+ });
149
+ const signedPayload = makeJws({
150
+ notificationType: 'REFUND',
151
+ data: { signedTransactionInfo, signedRenewalInfo: makeJws({}) },
152
+ });
153
+ await server.request('/onesub/webhook/apple', { signedPayload });
154
+ expect(await store.getByTransactionId('orig_sub_untouched')).not.toBeNull();
155
+ });
156
+ it('still routes subscription REFUND through the SubscriptionStore', async () => {
157
+ await store.save(sampleSub({
158
+ platform: 'apple',
159
+ originalTransactionId: 'orig_sub_apple',
160
+ status: 'active',
161
+ }));
162
+ const signedTransactionInfo = makeJws({
163
+ bundleId: 'com.example.app',
164
+ type: 'Auto-Renewable Subscription',
165
+ productId: 'pro_monthly',
166
+ transactionId: 'tx_sub_apple_1',
167
+ originalTransactionId: 'orig_sub_apple',
168
+ purchaseDate: Date.now(),
169
+ expiresDate: Date.now() + 86400000,
170
+ });
171
+ const signedPayload = makeJws({
172
+ notificationType: 'REFUND',
173
+ data: { signedTransactionInfo, signedRenewalInfo: makeJws({}) },
174
+ });
175
+ const resp = await server.request('/onesub/webhook/apple', { signedPayload });
176
+ expect(resp.status).toBe(200);
177
+ const updated = await store.getByTransactionId('orig_sub_apple');
178
+ expect(updated?.status).toBe(SUBSCRIPTION_STATUS.CANCELED);
179
+ });
180
+ });
181
+ // ── Google webhook: voidedPurchaseNotification ──────────────────────────────
182
+ function makeVoidedPushBody(notification) {
183
+ const json = JSON.stringify({
184
+ version: '1.0',
185
+ eventTimeMillis: String(Date.now()),
186
+ ...notification,
187
+ });
188
+ return {
189
+ message: {
190
+ data: Buffer.from(json, 'utf-8').toString('base64'),
191
+ messageId: '1',
192
+ },
193
+ subscription: 'projects/x/subscriptions/y',
194
+ };
195
+ }
196
+ describe('Google webhook — voidedPurchaseNotification', () => {
197
+ let store;
198
+ let purchaseStore;
199
+ let server;
200
+ beforeEach(() => {
201
+ store = new InMemorySubscriptionStore();
202
+ purchaseStore = new InMemoryPurchaseStore();
203
+ server = buildServer(googleConfig(), store, purchaseStore);
204
+ });
205
+ it('removes IAP row when productType=2 (one-time product refund)', async () => {
206
+ await purchaseStore.savePurchase(samplePurchase({
207
+ platform: 'google',
208
+ transactionId: 'GPA.refunded_order',
209
+ }));
210
+ const resp = await server.request('/onesub/webhook/google', makeVoidedPushBody({
211
+ packageName: 'com.example.app',
212
+ voidedPurchaseNotification: {
213
+ purchaseToken: 'tok_x',
214
+ orderId: 'GPA.refunded_order',
215
+ productType: 2,
216
+ refundType: 1,
217
+ },
218
+ }));
219
+ expect(resp.status).toBe(200);
220
+ expect(await purchaseStore.getPurchaseByTransactionId('GPA.refunded_order')).toBeNull();
221
+ });
222
+ it('cancels subscription when productType=1', async () => {
223
+ await store.save(sampleSub({ originalTransactionId: 'tok_sub' }));
224
+ const resp = await server.request('/onesub/webhook/google', makeVoidedPushBody({
225
+ packageName: 'com.example.app',
226
+ voidedPurchaseNotification: {
227
+ purchaseToken: 'tok_sub',
228
+ orderId: 'GPA.sub_order',
229
+ productType: 1,
230
+ refundType: 1,
231
+ },
232
+ }));
233
+ expect(resp.status).toBe(200);
234
+ const updated = await store.getByTransactionId('tok_sub');
235
+ expect(updated?.status).toBe(SUBSCRIPTION_STATUS.CANCELED);
236
+ });
237
+ it('rejects voided notification when packageName mismatches', async () => {
238
+ const resp = await server.request('/onesub/webhook/google', makeVoidedPushBody({
239
+ packageName: 'com.attacker.app',
240
+ voidedPurchaseNotification: {
241
+ purchaseToken: 'tok',
242
+ orderId: 'GPA.x',
243
+ productType: 2,
244
+ refundType: 1,
245
+ },
246
+ }));
247
+ expect(resp.status).toBe(400);
248
+ });
249
+ it('acknowledges with 200 even when the orderId is unknown', async () => {
250
+ // Idempotent ack semantics — Google retries until 2xx; we don't want loops
251
+ // when the row was already removed.
252
+ const resp = await server.request('/onesub/webhook/google', makeVoidedPushBody({
253
+ packageName: 'com.example.app',
254
+ voidedPurchaseNotification: {
255
+ purchaseToken: 'tok',
256
+ orderId: 'GPA.unknown',
257
+ productType: 2,
258
+ refundType: 1,
259
+ },
260
+ }));
261
+ expect(resp.status).toBe(200);
262
+ });
263
+ });
264
+ // ── decodeGoogleVoidedNotification unit ─────────────────────────────────────
265
+ describe('decodeGoogleVoidedNotification', () => {
266
+ it('returns null for subscription notifications', () => {
267
+ const json = JSON.stringify({
268
+ packageName: 'com.example.app',
269
+ eventTimeMillis: '0',
270
+ subscriptionNotification: {
271
+ version: '1.0',
272
+ notificationType: 4,
273
+ purchaseToken: 't',
274
+ subscriptionId: 'p',
275
+ },
276
+ });
277
+ const result = decodeGoogleVoidedNotification({
278
+ message: { data: Buffer.from(json).toString('base64'), messageId: '1' },
279
+ subscription: 's',
280
+ });
281
+ expect(result).toBeNull();
282
+ });
283
+ it('extracts voided payload fields', () => {
284
+ const json = JSON.stringify({
285
+ packageName: 'com.example.app',
286
+ eventTimeMillis: '0',
287
+ voidedPurchaseNotification: {
288
+ purchaseToken: 'tok123',
289
+ orderId: 'GPA.xyz',
290
+ productType: 2,
291
+ refundType: 1,
292
+ },
293
+ });
294
+ const result = decodeGoogleVoidedNotification({
295
+ message: { data: Buffer.from(json).toString('base64'), messageId: '1' },
296
+ subscription: 's',
297
+ });
298
+ expect(result).toEqual({
299
+ purchaseToken: 'tok123',
300
+ orderId: 'GPA.xyz',
301
+ productType: 2,
302
+ refundType: 1,
303
+ packageName: 'com.example.app',
304
+ });
305
+ });
306
+ it('returns null for malformed base64', () => {
307
+ expect(decodeGoogleVoidedNotification({
308
+ message: { data: '!!!not-base64!!!', messageId: '1' },
309
+ subscription: 's',
310
+ })).toBeNull();
311
+ });
312
+ });
313
+ //# sourceMappingURL=webhook-refund.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-refund.test.js","sourceRoot":"","sources":["../../src/__tests__/webhook-refund.test.ts"],"names":[],"mappings":"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"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Outbound HTTP helpers shared by Apple/Google providers.
3
+ *
4
+ * Why timeouts: Node's global fetch has no default timeout. If the upstream
5
+ * (Apple App Store Server API, Google Play Developer API, Google OAuth) hangs,
6
+ * webhook handlers and validate routes hang with it — Apple/Google retry on
7
+ * their side, so a hung outbound call cascades into request pile-up here.
8
+ */
9
+ /** Default timeout for outbound API calls (10s). */
10
+ export declare const DEFAULT_FETCH_TIMEOUT_MS = 10000;
11
+ /**
12
+ * fetch with an `AbortController`-based timeout. Throws an `AbortError`-like
13
+ * Error when the timer fires. Caller is expected to catch and decide
14
+ * (return null, log, propagate as 5xx, etc.).
15
+ */
16
+ export declare function fetchWithTimeout(input: RequestInfo | URL, init?: RequestInit, timeoutMs?: number): Promise<Response>;
17
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,oDAAoD;AACpD,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAE/C;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,WAAW,GAAG,GAAG,EACxB,IAAI,CAAC,EAAE,WAAW,EAClB,SAAS,SAA2B,GACnC,OAAO,CAAC,QAAQ,CAAC,CAkBnB"}
package/dist/http.js ADDED
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Outbound HTTP helpers shared by Apple/Google providers.
3
+ *
4
+ * Why timeouts: Node's global fetch has no default timeout. If the upstream
5
+ * (Apple App Store Server API, Google Play Developer API, Google OAuth) hangs,
6
+ * webhook handlers and validate routes hang with it — Apple/Google retry on
7
+ * their side, so a hung outbound call cascades into request pile-up here.
8
+ */
9
+ /** Default timeout for outbound API calls (10s). */
10
+ export const DEFAULT_FETCH_TIMEOUT_MS = 10_000;
11
+ /**
12
+ * fetch with an `AbortController`-based timeout. Throws an `AbortError`-like
13
+ * Error when the timer fires. Caller is expected to catch and decide
14
+ * (return null, log, propagate as 5xx, etc.).
15
+ */
16
+ export async function fetchWithTimeout(input, init, timeoutMs = DEFAULT_FETCH_TIMEOUT_MS) {
17
+ const controller = new AbortController();
18
+ // Allow caller-provided signal to compose with our timeout.
19
+ const callerSignal = init?.signal;
20
+ if (callerSignal) {
21
+ if (callerSignal.aborted)
22
+ controller.abort(callerSignal.reason);
23
+ else
24
+ callerSignal.addEventListener('abort', () => controller.abort(callerSignal.reason), { once: true });
25
+ }
26
+ const timer = setTimeout(() => {
27
+ controller.abort(new Error(`[onesub] fetch timed out after ${timeoutMs}ms`));
28
+ }, timeoutMs);
29
+ try {
30
+ return await fetch(input, { ...init, signal: controller.signal });
31
+ }
32
+ finally {
33
+ clearTimeout(timer);
34
+ }
35
+ }
36
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,oDAAoD;AACpD,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAE/C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAwB,EACxB,IAAkB,EAClB,SAAS,GAAG,wBAAwB;IAEpC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,4DAA4D;IAC5D,MAAM,YAAY,GAAG,IAAI,EAAE,MAAM,CAAC;IAClC,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,YAAY,CAAC,OAAO;YAAE,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;;YAC3D,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3G,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;QAC5B,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,kCAAkC,SAAS,IAAI,CAAC,CAAC,CAAC;IAC/E,CAAC,EAAE,SAAS,CAAC,CAAC;IAEd,IAAI,CAAC;QACH,OAAO,MAAM,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IACpE,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -47,7 +47,7 @@ export declare function createOneSubServer(config: OneSubMiddlewareConfig): Retu
47
47
  export { InMemorySubscriptionStore, InMemoryPurchaseStore } from './store.js';
48
48
  export type { SubscriptionStore, PurchaseStore } from './store.js';
49
49
  export { PostgresSubscriptionStore, PostgresPurchaseStore } from './stores/postgres.js';
50
- export { validateAppleReceipt } from './providers/apple.js';
50
+ export { validateAppleReceipt, fetchAppleSubscriptionStatus } from './providers/apple.js';
51
51
  export { validateGoogleReceipt } from './providers/google.js';
52
52
  export { setLogger, log } from './logger.js';
53
53
  export default createOneSubMiddleware;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAQnE;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,kBAAkB;IAChE;;;OAGG;IACH,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CA+B7E;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,sBAAsB,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAW7F;AAGD,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAC9E,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAI9D,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAG7C,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAQnE;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,kBAAkB;IAChE;;;OAGG;IACH,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CA+B7E;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,sBAAsB,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAW7F;AAGD,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAC9E,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGxF,OAAO,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAI9D,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAG7C,eAAe,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -40,7 +40,7 @@ export function createOneSubMiddleware(config) {
40
40
  router.use(express.json({ limit: '50kb' }));
41
41
  router.use(createValidateRouter(config, store));
42
42
  router.use(createStatusRouter(store));
43
- router.use(createWebhookRouter(config, store));
43
+ router.use(createWebhookRouter(config, store, purchaseStore));
44
44
  router.use(createPurchaseRouter(config, purchaseStore));
45
45
  // Admin routes — only mounted when config.adminSecret is set
46
46
  const adminRouter = createAdminRouter(config, purchaseStore);
@@ -69,7 +69,7 @@ export function createOneSubServer(config) {
69
69
  export { InMemorySubscriptionStore, InMemoryPurchaseStore } from './store.js';
70
70
  export { PostgresSubscriptionStore, PostgresPurchaseStore } from './stores/postgres.js';
71
71
  // Provider functions for direct (non-HTTP) usage
72
- export { validateAppleReceipt } from './providers/apple.js';
72
+ export { validateAppleReceipt, fetchAppleSubscriptionStatus } from './providers/apple.js';
73
73
  export { validateGoogleReceipt } from './providers/google.js';
74
74
  // Logger plumbing — expose so non-middleware callers (direct provider use)
75
75
  // can still redirect logs.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { SubscriptionInfo, AppleNotificationPayload, OneSubServerConfig } from '@onesub/shared';
1
+ import type { SubscriptionInfo, AppleNotificationPayload, AppleConsumptionRequest, OneSubServerConfig } from '@onesub/shared';
2
2
  type AppleConfig = NonNullable<OneSubServerConfig['apple']>;
3
3
  /**
4
4
  * Decode and verify a StoreKit 2 signed transaction JWS.
@@ -46,9 +46,57 @@ export declare function validateAppleConsumableReceipt(signedTransaction: string
46
46
  */
47
47
  export declare function decodeAppleNotification(payload: AppleNotificationPayload, skipJwsVerification?: boolean): Promise<{
48
48
  originalTransactionId: string;
49
+ /** Per-transaction id (different from originalTransactionId for consumables / re-purchases). */
50
+ transactionId: string | null;
51
+ /** 'Auto-Renewable Subscription' | 'Consumable' | 'Non-Consumable' | 'Non-Renewing Subscription' */
52
+ type: string | null;
53
+ productId: string | null;
54
+ bundleId: string | null;
55
+ /** 'Production' | 'Sandbox' — drives which Apple API host to call back. */
56
+ environment: 'Production' | 'Sandbox';
49
57
  status: SubscriptionInfo['status'];
50
58
  willRenew: boolean;
51
- expiresAt: string;
59
+ /** May be null for non-subscription notifications (consumable refund). */
60
+ expiresAt: string | null;
52
61
  } | null>;
62
+ /** Test-only: clear the module-level Apple JWT cache. Not exported. */
63
+ declare function clearAppleJwtCacheForTests(): void;
64
+ export declare const __testing: {
65
+ clearAppleJwtCacheForTests: typeof clearAppleJwtCacheForTests;
66
+ };
67
+ /**
68
+ * PUT a ConsumptionRequest to Apple's
69
+ * /inApps/v1/transactions/consumption/{transactionId} endpoint.
70
+ *
71
+ * Apple sends CONSUMPTION_REQUEST notifications when a customer asks for a
72
+ * refund on a consumable. Without a response Apple has no usage signal and
73
+ * tends to grant the refund. This call provides the data Apple uses to weigh
74
+ * the refund decision.
75
+ *
76
+ * Fire-and-forget: failures are logged, never thrown — the webhook should
77
+ * still 200 to Apple even if our outbound call fails.
78
+ */
79
+ export declare function sendAppleConsumptionResponse(transactionId: string, body: AppleConsumptionRequest, config: AppleConfig, options?: {
80
+ sandbox?: boolean;
81
+ }): Promise<void>;
82
+ /**
83
+ * Fetch the current state of a subscription directly from Apple's App Store
84
+ * Server API — the canonical source of truth when webhooks have been missed,
85
+ * delivered out of order, or the local store has no record at all.
86
+ *
87
+ * GET /inApps/v1/subscriptions/{originalTransactionId}
88
+ * https://developer.apple.com/documentation/appstoreserverapi/get_all_subscription_statuses
89
+ *
90
+ * Returns null on:
91
+ * - Missing API credentials (issuerId/keyId/privateKey)
92
+ * - Network or auth failure
93
+ * - Empty response (transaction not found)
94
+ *
95
+ * Hosts can call this directly (e.g. from a reconciliation cron) or it runs
96
+ * automatically as the unknown-transaction fallback inside the Apple webhook.
97
+ */
98
+ export declare function fetchAppleSubscriptionStatus(originalTransactionId: string, config: AppleConfig, options?: {
99
+ sandbox?: boolean;
100
+ }): Promise<SubscriptionInfo | null>;
53
101
  export {};
54
102
  //# sourceMappingURL=apple.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"apple.d.ts","sourceRoot":"","sources":["../../src/providers/apple.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AASrG,KAAK,WAAW,GAAG,WAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;AA2F5D;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,gBAAgB,UAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAuBpF;AAsBD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAoDlC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,2EAA2E;IAC3E,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAsB,8BAA8B,CAClD,iBAAiB,EAAE,MAAM,EACzB,MAAM,EAAE,WAAW,EACnB,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAgFpC;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,wBAAwB,EACjC,mBAAmB,UAAQ,GAC1B,OAAO,CAAC;IAAE,qBAAqB,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA6B9H"}
1
+ {"version":3,"file":"apple.d.ts","sourceRoot":"","sources":["../../src/providers/apple.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,wBAAwB,EACxB,uBAAuB,EACvB,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AAUxB,KAAK,WAAW,GAAG,WAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;AA2F5D;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,gBAAgB,UAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAuBpF;AAsBD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAoDlC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,2EAA2E;IAC3E,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAsB,8BAA8B,CAClD,iBAAiB,EAAE,MAAM,EACzB,MAAM,EAAE,WAAW,EACnB,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAgFpC;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,wBAAwB,EACjC,mBAAmB,UAAQ,GAC1B,OAAO,CAAC;IACT,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gGAAgG;IAChG,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,oGAAoG;IACpG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,2EAA2E;IAC3E,WAAW,EAAE,YAAY,GAAG,SAAS,CAAC;IACtC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,0EAA0E;IAC1E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GAAG,IAAI,CAAC,CA2CR;AAgED,uEAAuE;AACvE,iBAAS,0BAA0B,IAAI,IAAI,CAG1C;AAED,eAAO,MAAM,SAAS;;CAAiC,CAAC;AAExD;;;;;;;;;;;GAWG;AACH,wBAAsB,4BAA4B,CAChD,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,uBAAuB,EAC7B,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9B,OAAO,CAAC,IAAI,CAAC,CAgCf;AAgDD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,4BAA4B,CAChD,qBAAqB,EAAE,MAAM,EAC7B,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA8ElC"}