@billfn/provider-apple 0.0.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.
@@ -0,0 +1,19 @@
1
+ import type { BillFnProviderAdapter } from '@billfn/core';
2
+ export interface AppleNotificationVerifierContext {
3
+ rawBody: string;
4
+ signedPayload: string;
5
+ }
6
+ export interface AppleAdvancedCommerceConfig {
7
+ tokenProvider: () => Promise<string>;
8
+ baseUrl?: string;
9
+ enabled?: boolean;
10
+ }
11
+ export interface AppleProviderConfig {
12
+ fetch?: typeof fetch;
13
+ environment?: 'production' | 'sandbox';
14
+ tokenProvider: () => Promise<string>;
15
+ notificationVerifier?: (context: AppleNotificationVerifierContext) => Promise<Record<string, unknown> | null>;
16
+ advancedCommerce?: AppleAdvancedCommerceConfig;
17
+ }
18
+ export declare function createAppleProvider(config: AppleProviderConfig): BillFnProviderAdapter;
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAOV,qBAAqB,EAQtB,MAAM,cAAc,CAAC;AAGtB,MAAM,WAAW,gCAAgC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,2BAA2B;IAC1C,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,WAAW,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACvC,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,gCAAgC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9G,gBAAgB,CAAC,EAAE,2BAA2B,CAAC;CAChD;AAQD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,qBAAqB,CAiPtF"}
package/dist/index.js ADDED
@@ -0,0 +1,654 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { createBillFnError } from '@billfn/core';
3
+ export function createAppleProvider(config) {
4
+ const fetchImpl = config.fetch ?? fetch;
5
+ return {
6
+ provider: 'apple',
7
+ capabilities: {
8
+ createCheckout: true,
9
+ verifyCheckout: true,
10
+ cancelSubscription: true,
11
+ syncSubscription: true,
12
+ restorePurchases: true,
13
+ webhookIngestion: true,
14
+ changeSubscription: true,
15
+ resumeSubscription: true,
16
+ refundCharge: true,
17
+ notificationHistory: Boolean(config.notificationVerifier)
18
+ },
19
+ async createCheckout(input) {
20
+ const appAccountToken = createAppleAppAccountToken(input.billingAccount.id);
21
+ return {
22
+ status: 'requires_action',
23
+ clientAction: {
24
+ type: 'apple-purchase',
25
+ productId: input.price.providerProductId,
26
+ metadata: { appAccountToken }
27
+ },
28
+ raw: { appAccountToken }
29
+ };
30
+ },
31
+ async verifyCheckout(input) {
32
+ const transactionId = readString(input.payload ?? {}, ['transactionId', 'originalTransactionId']);
33
+ if (!transactionId) {
34
+ throw createBillFnError({
35
+ code: 'BILLFN_VALIDATION_ERROR',
36
+ message: 'Apple verification requires a transactionId or originalTransactionId'
37
+ });
38
+ }
39
+ if (input.price.kind === 'subscription') {
40
+ const response = await requestStoreKitWithFallback(fetchImpl, config, `/inApps/v1/subscriptions/${transactionId}`);
41
+ return mapAppleSubscriptionResponse(response.payload, {
42
+ productId: input.price.providerProductId,
43
+ reference: transactionId,
44
+ appAccountToken: createAppleAppAccountToken(input.billingAccount.id)
45
+ });
46
+ }
47
+ const response = await requestStoreKitWithFallback(fetchImpl, config, `/inApps/v2/history/${transactionId}`);
48
+ return mapAppleHistoryResponse(response.payload, {
49
+ productId: input.price.providerProductId,
50
+ reference: transactionId,
51
+ appAccountToken: createAppleAppAccountToken(input.billingAccount.id)
52
+ });
53
+ },
54
+ async fetchSubscription(input) {
55
+ const transactionId = input.subscription.providerSubscriptionId ?? input.subscription.providerChargeId;
56
+ if (!transactionId) {
57
+ throw createBillFnError({
58
+ code: 'BILLFN_VALIDATION_ERROR',
59
+ message: 'Apple subscription sync requires a provider subscription reference'
60
+ });
61
+ }
62
+ const response = await requestStoreKitWithFallback(fetchImpl, config, `/inApps/v1/subscriptions/${transactionId}`);
63
+ return mapAppleSubscriptionResponse(response.payload, {
64
+ productId: input.price.providerProductId,
65
+ reference: transactionId,
66
+ appAccountToken: createAppleAppAccountToken(input.subscription.billingAccountId)
67
+ });
68
+ },
69
+ async cancelSubscription(input) {
70
+ const transactionId = input.subscription.providerChargeId ?? input.subscription.providerSubscriptionId;
71
+ if (!transactionId) {
72
+ throw createBillFnError({
73
+ code: 'BILLFN_VALIDATION_ERROR',
74
+ message: 'Apple cancellation requires a transaction reference'
75
+ });
76
+ }
77
+ if (!config.advancedCommerce?.enabled || !config.advancedCommerce.tokenProvider) {
78
+ return manageSubscriptionAction('Apple subscription management is handled by Apple-managed surfaces');
79
+ }
80
+ const response = await requestAdvancedCommerce(fetchImpl, config.advancedCommerce, `/subscription/cancel/${transactionId}`, {
81
+ method: 'POST'
82
+ });
83
+ return {
84
+ operationStatus: 'applied',
85
+ billingState: {
86
+ subscriptionStatus: 'canceled',
87
+ checkoutStatus: 'succeeded',
88
+ providerSubscriptionId: input.subscription.providerSubscriptionId,
89
+ providerChargeId: input.subscription.providerChargeId,
90
+ currentPeriodStart: input.subscription.currentPeriodStart,
91
+ currentPeriodEnd: input.subscription.currentPeriodEnd,
92
+ autoRenew: false,
93
+ raw: response
94
+ },
95
+ raw: response
96
+ };
97
+ },
98
+ async changeSubscription(_input) {
99
+ return manageSubscriptionAction('Apple plan changes are handled by Apple-managed subscription surfaces');
100
+ },
101
+ async resumeSubscription(_input) {
102
+ return manageSubscriptionAction('Apple subscription resume is handled by Apple-managed subscription surfaces');
103
+ },
104
+ async refundCharge(input) {
105
+ const transactionId = input.providerChargeId ?? input.subscription?.providerChargeId ?? input.subscription?.providerSubscriptionId;
106
+ if (!transactionId) {
107
+ throw createBillFnError({
108
+ code: 'BILLFN_VALIDATION_ERROR',
109
+ message: 'Apple refund requires a transaction reference'
110
+ });
111
+ }
112
+ if (!config.advancedCommerce?.enabled || !config.advancedCommerce.tokenProvider) {
113
+ return manageSubscriptionAction('Apple refunds require Advanced Commerce or Apple-managed support flows');
114
+ }
115
+ const response = await requestAdvancedCommerce(fetchImpl, config.advancedCommerce, `/subscription/revoke/${transactionId}`, {
116
+ method: 'POST',
117
+ body: JSON.stringify({
118
+ reason: input.reason
119
+ })
120
+ });
121
+ return {
122
+ operationStatus: 'applied',
123
+ providerRefundId: readString(response, ['requestReferenceId', 'refundId']) ?? undefined,
124
+ billingState: input.subscription
125
+ ? {
126
+ subscriptionStatus: 'canceled',
127
+ checkoutStatus: 'succeeded',
128
+ providerSubscriptionId: input.subscription.providerSubscriptionId,
129
+ providerChargeId: input.subscription.providerChargeId,
130
+ currentPeriodStart: input.subscription.currentPeriodStart,
131
+ currentPeriodEnd: input.subscription.currentPeriodEnd,
132
+ autoRenew: false,
133
+ raw: response
134
+ }
135
+ : undefined,
136
+ raw: response
137
+ };
138
+ },
139
+ async restorePurchases(input) {
140
+ const response = await requestStoreKitWithFallback(fetchImpl, config, input.price.kind === 'subscription'
141
+ ? `/inApps/v1/subscriptions/${input.purchaseReference}`
142
+ : `/inApps/v2/history/${input.purchaseReference}`);
143
+ const expectation = {
144
+ productId: input.price.providerProductId,
145
+ reference: input.purchaseReference,
146
+ appAccountToken: createAppleAppAccountToken(input.billingAccount.id)
147
+ };
148
+ return [input.price.kind === 'subscription'
149
+ ? mapAppleSubscriptionResponse(response.payload, expectation)
150
+ : mapAppleHistoryResponse(response.payload, expectation)];
151
+ },
152
+ async parseWebhook(input) {
153
+ let payload;
154
+ try {
155
+ payload = JSON.parse(input.rawBody);
156
+ }
157
+ catch {
158
+ throw createBillFnError({
159
+ code: 'BILLFN_VALIDATION_ERROR',
160
+ message: 'Apple webhook payload must be valid JSON'
161
+ });
162
+ }
163
+ const signedPayload = readString(payload, ['signedPayload']);
164
+ if (!signedPayload) {
165
+ throw createBillFnError({
166
+ code: 'BILLFN_VALIDATION_ERROR',
167
+ message: 'Apple webhook payload must include signedPayload'
168
+ });
169
+ }
170
+ const decoded = await decodeNotificationPayload(config, {
171
+ rawBody: input.rawBody,
172
+ signedPayload
173
+ });
174
+ return [mapAppleNotificationEvent(decoded, signedPayload)];
175
+ },
176
+ async fetchNotificationHistory(input) {
177
+ if (!config.notificationVerifier) {
178
+ throw createBillFnError({
179
+ code: 'BILLFN_FEATURE_UNAVAILABLE',
180
+ message: 'Apple notification history requires notificationVerifier'
181
+ });
182
+ }
183
+ const response = await requestStoreKitWithFallback(fetchImpl, config, buildNotificationHistoryPath(input.cursor), {
184
+ method: 'POST',
185
+ body: JSON.stringify(buildNotificationHistoryRequest())
186
+ });
187
+ const notifications = Array.isArray(response.payload.notificationHistory)
188
+ ? response.payload.notificationHistory
189
+ : Array.isArray(response.payload.signedNotifications)
190
+ ? response.payload.signedNotifications
191
+ : [];
192
+ const events = [];
193
+ for (const entry of notifications) {
194
+ const signedPayload = typeof entry === 'string'
195
+ ? entry
196
+ : typeof entry === 'object' && entry !== null && typeof entry.signedPayload === 'string'
197
+ ? entry.signedPayload
198
+ : null;
199
+ if (!signedPayload) {
200
+ continue;
201
+ }
202
+ const decoded = await decodeNotificationPayload(config, {
203
+ rawBody: JSON.stringify({ signedPayload }),
204
+ signedPayload
205
+ });
206
+ events.push(mapAppleNotificationEvent(decoded, signedPayload));
207
+ }
208
+ return {
209
+ events,
210
+ nextCursor: readString(response.payload, ['paginationToken', 'nextPaginationToken']) ?? undefined
211
+ };
212
+ }
213
+ };
214
+ }
215
+ async function requestStoreKitWithFallback(fetchImpl, config, path, init = {}) {
216
+ const initial = config.environment ?? 'production';
217
+ const environments = initial === 'production' ? ['production', 'sandbox'] : ['sandbox'];
218
+ let lastError;
219
+ for (const environment of environments) {
220
+ try {
221
+ const payload = await requestJson(fetchImpl, buildStoreKitBaseUrl(environment) + path, await config.tokenProvider(), init);
222
+ return {
223
+ environment,
224
+ payload
225
+ };
226
+ }
227
+ catch (error) {
228
+ lastError = error;
229
+ if (!shouldFallbackToSandbox(error, environment)) {
230
+ throw error;
231
+ }
232
+ }
233
+ }
234
+ throw lastError;
235
+ }
236
+ async function requestAdvancedCommerce(fetchImpl, config, path, init) {
237
+ const baseUrl = (config.baseUrl ?? 'https://api.storekit.itunes.apple.com/advancedCommerce/v1').replace(/\/$/, '');
238
+ const response = await fetchImpl(`${baseUrl}${path}`, {
239
+ ...init,
240
+ headers: {
241
+ authorization: `Bearer ${await config.tokenProvider()}`,
242
+ 'content-type': 'application/json',
243
+ ...(init.headers ?? {})
244
+ }
245
+ });
246
+ const raw = await response.text();
247
+ if (!response.ok) {
248
+ throw createBillFnError({
249
+ code: 'BILLFN_PROVIDER_ERROR',
250
+ message: `Apple Advanced Commerce request failed with status ${response.status}`,
251
+ details: {
252
+ status: response.status,
253
+ body: raw
254
+ }
255
+ });
256
+ }
257
+ return raw ? JSON.parse(raw) : {};
258
+ }
259
+ async function requestJson(fetchImpl, url, token, init = {}) {
260
+ const response = await fetchImpl(url, {
261
+ ...init,
262
+ method: init.method ?? 'GET',
263
+ headers: {
264
+ authorization: `Bearer ${token}`,
265
+ 'content-type': 'application/json',
266
+ ...(init.headers ?? {})
267
+ }
268
+ });
269
+ const raw = await response.text();
270
+ if (!response.ok) {
271
+ throw createProviderError(response.status, raw);
272
+ }
273
+ return raw ? JSON.parse(raw) : {};
274
+ }
275
+ function createProviderError(status, body) {
276
+ return createBillFnError({
277
+ code: 'BILLFN_PROVIDER_ERROR',
278
+ message: `Apple request failed with status ${status}`,
279
+ details: {
280
+ status,
281
+ body
282
+ }
283
+ });
284
+ }
285
+ function buildStoreKitBaseUrl(environment) {
286
+ return environment === 'production'
287
+ ? 'https://api.storekit.itunes.apple.com'
288
+ : 'https://api.storekit-sandbox.itunes.apple.com';
289
+ }
290
+ function shouldFallbackToSandbox(error, environment) {
291
+ if (environment !== 'production') {
292
+ return false;
293
+ }
294
+ if (!error || typeof error !== 'object' || !('details' in error)) {
295
+ return false;
296
+ }
297
+ const details = error.details;
298
+ if (details?.status !== 404 || typeof details.body !== 'string') {
299
+ return false;
300
+ }
301
+ try {
302
+ const payload = JSON.parse(details.body);
303
+ return payload.errorCode === 4040010;
304
+ }
305
+ catch {
306
+ return false;
307
+ }
308
+ }
309
+ async function decodeNotificationPayload(config, context) {
310
+ if (config.notificationVerifier) {
311
+ const verified = await config.notificationVerifier(context);
312
+ if (!verified) {
313
+ throw createBillFnError({
314
+ code: 'BILLFN_WEBHOOK_SIGNATURE_INVALID',
315
+ message: 'Apple notification signature verification failed'
316
+ });
317
+ }
318
+ return {
319
+ payload: verified,
320
+ signatureVerified: true
321
+ };
322
+ }
323
+ const payload = decodeJwtPayload(context.signedPayload);
324
+ if (!payload) {
325
+ throw createBillFnError({
326
+ code: 'BILLFN_VALIDATION_ERROR',
327
+ message: 'Apple notification signedPayload could not be decoded'
328
+ });
329
+ }
330
+ return {
331
+ payload,
332
+ signatureVerified: false
333
+ };
334
+ }
335
+ function buildNotificationHistoryPath(cursor) {
336
+ const params = new URLSearchParams();
337
+ if (cursor) {
338
+ params.set('paginationToken', cursor);
339
+ }
340
+ const query = params.toString();
341
+ return query ? `/inApps/v1/notifications/history?${query}` : '/inApps/v1/notifications/history';
342
+ }
343
+ function buildNotificationHistoryRequest() {
344
+ const endDate = Date.now();
345
+ return {
346
+ startDate: endDate - 24 * 60 * 60 * 1000,
347
+ endDate
348
+ };
349
+ }
350
+ function mapAppleNotificationEvent(decoded, signedPayload) {
351
+ const notification = decoded.payload;
352
+ const data = asRecord(notification.data) ?? {};
353
+ const transaction = decodeSignedPayload(data, 'signedTransactionInfo');
354
+ const renewal = decodeSignedPayload(data, 'signedRenewalInfo');
355
+ const notificationType = readString(notification, ['notificationType']) ?? 'UNKNOWN';
356
+ const subtype = readString(notification, ['subtype']) ?? undefined;
357
+ const state = mapAppleNotificationState(notificationType, subtype, transaction, renewal);
358
+ return {
359
+ providerEventId: readString(notification, ['notificationUUID']) ?? readString(notification, ['notificationId']) ?? signedPayload,
360
+ type: subtype ? `${notificationType}.${subtype}` : notificationType,
361
+ signatureVerified: decoded.signatureVerified,
362
+ occurredAt: millisToIso(readTimestamp(notification, ['signedDate'])) ?? undefined,
363
+ providerSubscriptionId: readString(transaction ?? {}, ['originalTransactionId']) ?? undefined,
364
+ providerChargeId: readString(transaction ?? {}, ['transactionId']) ?? undefined,
365
+ priceId: readString(transaction ?? {}, ['productId']) ?? undefined,
366
+ billingState: state,
367
+ raw: notification
368
+ };
369
+ }
370
+ function mapAppleNotificationState(notificationType, subtype, transaction, renewal) {
371
+ if (notificationType === 'TEST') {
372
+ return undefined;
373
+ }
374
+ const transactionState = mapTransactionPayload(transaction, renewal);
375
+ if (!transactionState) {
376
+ return undefined;
377
+ }
378
+ switch (notificationType) {
379
+ case 'SUBSCRIBED':
380
+ case 'DID_RENEW':
381
+ return {
382
+ ...transactionState,
383
+ subscriptionStatus: 'active',
384
+ checkoutStatus: 'succeeded'
385
+ };
386
+ case 'DID_FAIL_TO_RENEW':
387
+ return {
388
+ ...transactionState,
389
+ subscriptionStatus: subtype === 'GRACE_PERIOD' ? 'grace' : 'past_due',
390
+ checkoutStatus: 'succeeded'
391
+ };
392
+ case 'EXPIRED':
393
+ return {
394
+ ...transactionState,
395
+ subscriptionStatus: 'expired',
396
+ checkoutStatus: 'failed',
397
+ autoRenew: false
398
+ };
399
+ case 'REFUND':
400
+ case 'REFUND_DECLINED_RENEWAL':
401
+ case 'REVOKE':
402
+ case 'CANCEL':
403
+ return {
404
+ ...transactionState,
405
+ subscriptionStatus: 'canceled',
406
+ checkoutStatus: 'succeeded',
407
+ autoRenew: false
408
+ };
409
+ case 'DID_CHANGE_RENEWAL_STATUS':
410
+ return {
411
+ ...transactionState,
412
+ subscriptionStatus: 'active',
413
+ checkoutStatus: 'succeeded',
414
+ autoRenew: subtype === 'AUTO_RENEW_DISABLED' ? false : transactionState.autoRenew
415
+ };
416
+ case 'DID_CHANGE_RENEWAL_PREF':
417
+ return {
418
+ ...transactionState,
419
+ subscriptionStatus: 'active',
420
+ checkoutStatus: 'succeeded'
421
+ };
422
+ default:
423
+ return transactionState;
424
+ }
425
+ }
426
+ function mapAppleSubscriptionResponse(payload, expectation) {
427
+ const { record: lastTransaction, transaction } = selectAppleLastTransaction(payload, expectation);
428
+ const renewalInfo = decodeSignedPayload(lastTransaction, 'signedRenewalInfo');
429
+ const statusCode = readNumber(lastTransaction ?? {}, ['status']) ?? readNumber(transaction, ['status']) ?? 1;
430
+ const subscriptionStatus = normalizeAppleStatus(statusCode);
431
+ return {
432
+ subscriptionStatus,
433
+ checkoutStatus: subscriptionStatus === 'failed' || subscriptionStatus === 'expired' ? 'failed' : 'succeeded',
434
+ providerSubscriptionId: readString(transaction ?? {}, ['originalTransactionId']) ?? undefined,
435
+ providerChargeId: readString(transaction ?? {}, ['transactionId']) ?? undefined,
436
+ currentPeriodStart: millisToIso(readTimestamp(transaction, ['purchaseDate'])) ?? undefined,
437
+ currentPeriodEnd: millisToIso(readTimestamp(transaction, ['expiresDate'])) ?? undefined,
438
+ autoRenew: readNumber(renewalInfo, ['autoRenewStatus']) === 1,
439
+ raw: payload
440
+ };
441
+ }
442
+ function mapAppleHistoryResponse(payload, expectation) {
443
+ const transactions = extractHistoryTransactions(payload);
444
+ const transaction = selectAppleTransaction(transactions, expectation, 'history');
445
+ const expiresAt = millisToIso(readTimestamp(transaction, ['expiresDate'])) ?? undefined;
446
+ const revokedAt = millisToIso(readTimestamp(transaction, ['revocationDate'])) ?? undefined;
447
+ const isExpired = Boolean(expiresAt && new Date(expiresAt).getTime() < Date.now());
448
+ const subscriptionStatus = revokedAt ? 'canceled' : isExpired ? 'expired' : 'active';
449
+ return {
450
+ subscriptionStatus,
451
+ checkoutStatus: subscriptionStatus === 'expired' ? 'failed' : 'succeeded',
452
+ providerSubscriptionId: readString(transaction, ['originalTransactionId']) ?? undefined,
453
+ providerChargeId: readString(transaction, ['transactionId']) ?? undefined,
454
+ currentPeriodStart: millisToIso(readTimestamp(transaction, ['purchaseDate'])) ?? undefined,
455
+ currentPeriodEnd: expiresAt,
456
+ autoRenew: false,
457
+ raw: payload
458
+ };
459
+ }
460
+ function mapTransactionPayload(transaction, renewal) {
461
+ if (!transaction) {
462
+ return undefined;
463
+ }
464
+ const statusCode = readNumber(transaction, ['status']) ?? 1;
465
+ return {
466
+ subscriptionStatus: normalizeAppleStatus(statusCode),
467
+ checkoutStatus: statusCode === 2 ? 'failed' : 'succeeded',
468
+ providerSubscriptionId: readString(transaction, ['originalTransactionId']) ?? undefined,
469
+ providerChargeId: readString(transaction, ['transactionId']) ?? undefined,
470
+ currentPeriodStart: millisToIso(readTimestamp(transaction, ['purchaseDate'])) ?? undefined,
471
+ currentPeriodEnd: millisToIso(readTimestamp(transaction, ['expiresDate'])) ?? undefined,
472
+ autoRenew: readNumber(renewal, ['autoRenewStatus']) === 1,
473
+ raw: {
474
+ transaction,
475
+ renewal
476
+ }
477
+ };
478
+ }
479
+ function extractLastTransactionRecords(payload) {
480
+ const groups = Array.isArray(payload.data) ? payload.data : [];
481
+ return groups.flatMap((group) => asArrayOfRecords(asRecord(group)?.lastTransactions));
482
+ }
483
+ function selectAppleLastTransaction(payload, expectation) {
484
+ const candidates = extractLastTransactionRecords(payload)
485
+ .map((record) => ({ record, transaction: decodeSignedPayload(record, 'signedTransactionInfo') }))
486
+ .filter((candidate) => candidate.transaction !== null);
487
+ if (candidates.length === 0) {
488
+ throw createBillFnError({
489
+ code: 'BILLFN_NOT_FOUND',
490
+ message: 'Apple subscription response did not contain any transactions'
491
+ });
492
+ }
493
+ const match = candidates.find((candidate) => appleTransactionMatches(candidate.transaction, expectation));
494
+ if (!match) {
495
+ throwAppleTransactionConflict();
496
+ }
497
+ return match;
498
+ }
499
+ function selectAppleTransaction(transactions, expectation, responseKind) {
500
+ if (transactions.length === 0) {
501
+ throw createBillFnError({
502
+ code: 'BILLFN_NOT_FOUND',
503
+ message: `Apple ${responseKind} response did not contain any transactions`
504
+ });
505
+ }
506
+ const match = transactions.find((transaction) => appleTransactionMatches(transaction, expectation));
507
+ if (!match) {
508
+ throwAppleTransactionConflict();
509
+ }
510
+ return match;
511
+ }
512
+ function appleTransactionMatches(transaction, expectation) {
513
+ const transactionId = readString(transaction, ['transactionId']);
514
+ const originalTransactionId = readString(transaction, ['originalTransactionId']);
515
+ const productId = readString(transaction, ['productId']);
516
+ const appAccountToken = readString(transaction, ['appAccountToken']);
517
+ return (productId === expectation.productId &&
518
+ appAccountToken?.toLowerCase() === expectation.appAccountToken.toLowerCase() &&
519
+ (transactionId === expectation.reference || originalTransactionId === expectation.reference));
520
+ }
521
+ function throwAppleTransactionConflict() {
522
+ throw createBillFnError({
523
+ code: 'BILLFN_CONFLICT',
524
+ message: 'Apple transaction does not match the checkout product, reference, and billing account token'
525
+ });
526
+ }
527
+ function extractHistoryTransactions(payload) {
528
+ const signedTransactions = Array.isArray(payload.signedTransactions) ? payload.signedTransactions : [];
529
+ return signedTransactions
530
+ .map((entry) => (typeof entry === 'string' ? decodeJwtPayload(entry) : null))
531
+ .filter(Boolean);
532
+ }
533
+ function decodeSignedPayload(record, key) {
534
+ const token = record[key];
535
+ return typeof token === 'string' ? decodeJwtPayload(token) : null;
536
+ }
537
+ function decodeJwtPayload(token) {
538
+ const parts = token.split('.');
539
+ if (parts.length < 2) {
540
+ return null;
541
+ }
542
+ try {
543
+ const base = parts[1].replace(/-/g, '+').replace(/_/g, '/');
544
+ const padded = base.padEnd(Math.ceil(base.length / 4) * 4, '=');
545
+ return JSON.parse(Buffer.from(padded, 'base64').toString('utf8'));
546
+ }
547
+ catch {
548
+ return null;
549
+ }
550
+ }
551
+ function manageSubscriptionAction(message) {
552
+ return {
553
+ operationStatus: 'requires_action',
554
+ clientAction: {
555
+ type: 'manage-subscription',
556
+ metadata: {
557
+ provider: 'apple'
558
+ }
559
+ },
560
+ raw: {
561
+ message
562
+ }
563
+ };
564
+ }
565
+ function normalizeAppleStatus(statusCode) {
566
+ switch (statusCode) {
567
+ case 1:
568
+ return 'active';
569
+ case 2:
570
+ return 'expired';
571
+ case 3:
572
+ case 4:
573
+ return 'grace';
574
+ case 5:
575
+ return 'canceled';
576
+ default:
577
+ return 'failed';
578
+ }
579
+ }
580
+ function createAppleAppAccountToken(billingAccountId) {
581
+ const bytes = createHash('sha256')
582
+ .update(`billfn:apple:${billingAccountId}`, 'utf8')
583
+ .digest()
584
+ .subarray(0, 16);
585
+ bytes[6] = (bytes[6] & 0x0f) | 0x50;
586
+ bytes[8] = (bytes[8] & 0x3f) | 0x80;
587
+ const value = bytes.toString('hex');
588
+ return [
589
+ value.slice(0, 8),
590
+ value.slice(8, 12),
591
+ value.slice(12, 16),
592
+ value.slice(16, 20),
593
+ value.slice(20)
594
+ ].join('-');
595
+ }
596
+ function millisToIso(value) {
597
+ if (!value) {
598
+ return null;
599
+ }
600
+ const numeric = Number(value);
601
+ if (Number.isFinite(numeric)) {
602
+ return new Date(numeric).toISOString();
603
+ }
604
+ const date = new Date(value);
605
+ if (Number.isNaN(date.getTime())) {
606
+ return null;
607
+ }
608
+ return date.toISOString();
609
+ }
610
+ function readTimestamp(record, keys) {
611
+ if (!record) {
612
+ return null;
613
+ }
614
+ for (const key of keys) {
615
+ const value = record[key];
616
+ if (typeof value === 'string' && value.length > 0) {
617
+ return value;
618
+ }
619
+ if (typeof value === 'number' && Number.isFinite(value)) {
620
+ return String(value);
621
+ }
622
+ }
623
+ return null;
624
+ }
625
+ function readString(record, keys) {
626
+ for (const key of keys) {
627
+ const value = record[key];
628
+ if (typeof value === 'string' && value.length > 0) {
629
+ return value;
630
+ }
631
+ }
632
+ return null;
633
+ }
634
+ function readNumber(record, keys) {
635
+ if (!record) {
636
+ return null;
637
+ }
638
+ for (const key of keys) {
639
+ const value = record[key];
640
+ if (typeof value === 'number' && Number.isFinite(value)) {
641
+ return value;
642
+ }
643
+ }
644
+ return null;
645
+ }
646
+ function asRecord(value) {
647
+ return typeof value === 'object' && value !== null ? value : null;
648
+ }
649
+ function asArrayOfRecords(value) {
650
+ return Array.isArray(value)
651
+ ? value.filter((entry) => typeof entry === 'object' && entry !== null)
652
+ : [];
653
+ }
654
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@billfn/provider-apple",
3
+ "version": "0.0.1",
4
+ "description": "Apple provider adapter for billfn",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "test": "vitest run",
20
+ "typecheck": "tsc --noEmit",
21
+ "clean": "rm -rf dist"
22
+ },
23
+ "author": "21n",
24
+ "license": "MIT",
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "dependencies": {
29
+ "@billfn/core": "^0.0.1"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^22.0.0",
33
+ "typescript": "^5.6.0",
34
+ "vitest": "^3.2.4"
35
+ },
36
+ "gitHead": "f8eb29238bac5f1c40843c938335901ff6cf2a73"
37
+ }