@proxy-checkout/stripe-server-js 0.0.0-pr-76.27.1 → 0.0.0-pr-76.30.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.
- package/dist/cjs/errors.js +1 -1
- package/dist/cjs/open-checkout.js +3 -0
- package/dist/cjs/sync-checkout-cart.js +27 -14
- package/dist/cjs/version.js +1 -1
- package/dist/esm/errors.d.ts +3 -3
- package/dist/esm/errors.js +1 -1
- package/dist/esm/open-checkout.js +4 -1
- package/dist/esm/sync-checkout-cart.js +27 -14
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +4 -4
package/dist/cjs/errors.js
CHANGED
|
@@ -23,7 +23,7 @@ exports.ProxyStripeOpenCheckoutError = ProxyStripeOpenCheckoutError;
|
|
|
23
23
|
class ProxyStripeCartSyncError extends Error {
|
|
24
24
|
name = "ProxyStripeCartSyncError";
|
|
25
25
|
code;
|
|
26
|
-
/** True when the Proxy
|
|
26
|
+
/** True only when the SDK verified Proxy and Stripe are in a consistent state. */
|
|
27
27
|
reconciled;
|
|
28
28
|
cause;
|
|
29
29
|
rollbackCause;
|
|
@@ -47,6 +47,9 @@ async function openCheckout(options) {
|
|
|
47
47
|
let rollbackCart;
|
|
48
48
|
const reconciledCart = await options.reconcileCart?.({ cart, offer, session: proxySession });
|
|
49
49
|
if (reconciledCart) {
|
|
50
|
+
if (options.getCartBuyerReference !== undefined) {
|
|
51
|
+
(0, server_js_1.assertCartBuyerReference)(options.getCartBuyerReference(reconciledCart.cart), proxySession);
|
|
52
|
+
}
|
|
50
53
|
const priorCart = {
|
|
51
54
|
amountMinor: proxySession.amountMinor,
|
|
52
55
|
cartSnapshot: proxySession.cartSnapshot,
|
|
@@ -47,26 +47,33 @@ async function syncCheckoutCart(options) {
|
|
|
47
47
|
expectedCartVersion: session.cartVersion,
|
|
48
48
|
requestId: options.requestId,
|
|
49
49
|
});
|
|
50
|
+
const stripeUpdateParams = {
|
|
51
|
+
line_items: options.buildStripeLineItems(next.cart),
|
|
52
|
+
};
|
|
53
|
+
const stripeUpdateOptions = buildStripeUpdateRequestOptions(options, proxyCartUpdate.cartVersion);
|
|
50
54
|
let updatedCheckout;
|
|
51
55
|
try {
|
|
52
|
-
updatedCheckout = await options.stripe.checkout.sessions.update(options.checkoutSessionId,
|
|
53
|
-
line_items: options.buildStripeLineItems(next.cart),
|
|
54
|
-
}, options.stripeRequestOptions);
|
|
56
|
+
updatedCheckout = await options.stripe.checkout.sessions.update(options.checkoutSessionId, stripeUpdateParams, stripeUpdateOptions);
|
|
55
57
|
}
|
|
56
|
-
catch
|
|
58
|
+
catch {
|
|
57
59
|
try {
|
|
58
|
-
await options.
|
|
59
|
-
amountMinor: prior.amountMinor,
|
|
60
|
-
cartSnapshot: prior.cartSnapshot,
|
|
61
|
-
currency: prior.currency,
|
|
62
|
-
expectedCartVersion: proxyCartUpdate.cartVersion,
|
|
63
|
-
requestId: options.requestId,
|
|
64
|
-
});
|
|
60
|
+
updatedCheckout = await options.stripe.checkout.sessions.update(options.checkoutSessionId, stripeUpdateParams, stripeUpdateOptions);
|
|
65
61
|
}
|
|
66
|
-
catch (
|
|
67
|
-
|
|
62
|
+
catch (retryCause) {
|
|
63
|
+
try {
|
|
64
|
+
await options.proxy.sessions.cart.set(options.proxySessionId, {
|
|
65
|
+
amountMinor: prior.amountMinor,
|
|
66
|
+
cartSnapshot: prior.cartSnapshot,
|
|
67
|
+
currency: prior.currency,
|
|
68
|
+
expectedCartVersion: proxyCartUpdate.cartVersion,
|
|
69
|
+
requestId: options.requestId,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch (rollbackCause) {
|
|
73
|
+
throw new errors_js_1.ProxyStripeCartSyncError("Stripe checkout update failed after an idempotent retry and the Proxy cart rollback failed; carts may be out of sync.", { cause: retryCause, code: "reconciliation_failed", reconciled: false, rollbackCause });
|
|
74
|
+
}
|
|
75
|
+
throw new errors_js_1.ProxyStripeCartSyncError("Stripe checkout update failed after an idempotent retry; the Proxy cart rollback was attempted, but Stripe state may still be ambiguous.", { cause: retryCause, code: "stripe_update_failed", reconciled: false });
|
|
68
76
|
}
|
|
69
|
-
throw new errors_js_1.ProxyStripeCartSyncError("Stripe checkout update failed; the Proxy cart was rolled back to its prior state.", { cause, code: "stripe_update_failed", reconciled: true });
|
|
70
77
|
}
|
|
71
78
|
return {
|
|
72
79
|
amountMinor: next.amountMinor,
|
|
@@ -76,6 +83,12 @@ async function syncCheckoutCart(options) {
|
|
|
76
83
|
currency: next.currency,
|
|
77
84
|
};
|
|
78
85
|
}
|
|
86
|
+
function buildStripeUpdateRequestOptions(options, cartVersion) {
|
|
87
|
+
return {
|
|
88
|
+
...options.stripeRequestOptions,
|
|
89
|
+
idempotencyKey: `proxy-sync-checkout-cart:${options.proxySessionId}:${options.checkoutSessionId}:${cartVersion}`,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
79
92
|
function assertSessionBoundTo(session, checkoutSessionId, psp) {
|
|
80
93
|
if (session.providerCheckoutSessionId !== checkoutSessionId ||
|
|
81
94
|
session.providerCheckoutSessionPsp !== psp) {
|
package/dist/cjs/version.js
CHANGED
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.proxyCheckoutStripeServerSdkVersion = exports.proxyCheckoutStripeServerSdkName = void 0;
|
|
4
4
|
exports.proxyCheckoutStripeServerSdkName = "@proxy-checkout/stripe-server-js";
|
|
5
|
-
exports.proxyCheckoutStripeServerSdkVersion = "0.0.0-pr-76.
|
|
5
|
+
exports.proxyCheckoutStripeServerSdkVersion = "0.0.0-pr-76.30.1";
|
package/dist/esm/errors.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Adapter-specific error raised when a Stripe/Proxy cart synchronization cannot
|
|
3
|
-
* complete cleanly. The `reconciled` flag
|
|
4
|
-
*
|
|
3
|
+
* complete cleanly. The `reconciled` flag is true only when the SDK verified the
|
|
4
|
+
* Proxy and Stripe carts are back in a consistent state.
|
|
5
5
|
*/
|
|
6
6
|
export type ProxyStripeCartSyncCode = "reconciliation_failed" | "stripe_update_failed";
|
|
7
7
|
export type ProxyStripeOpenCheckoutCode = "provider_binding_failed";
|
|
@@ -25,7 +25,7 @@ export declare class ProxyStripeOpenCheckoutError extends Error {
|
|
|
25
25
|
export declare class ProxyStripeCartSyncError extends Error {
|
|
26
26
|
readonly name = "ProxyStripeCartSyncError";
|
|
27
27
|
readonly code: ProxyStripeCartSyncCode;
|
|
28
|
-
/** True when the Proxy
|
|
28
|
+
/** True only when the SDK verified Proxy and Stripe are in a consistent state. */
|
|
29
29
|
readonly reconciled: boolean;
|
|
30
30
|
readonly cause: unknown;
|
|
31
31
|
readonly rollbackCause: unknown;
|
package/dist/esm/errors.js
CHANGED
|
@@ -19,7 +19,7 @@ export class ProxyStripeOpenCheckoutError extends Error {
|
|
|
19
19
|
export class ProxyStripeCartSyncError extends Error {
|
|
20
20
|
name = "ProxyStripeCartSyncError";
|
|
21
21
|
code;
|
|
22
|
-
/** True when the Proxy
|
|
22
|
+
/** True only when the SDK verified Proxy and Stripe are in a consistent state. */
|
|
23
23
|
reconciled;
|
|
24
24
|
cause;
|
|
25
25
|
rollbackCause;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* provider binding). Merchants provide only Stripe params, so the adapter owns
|
|
7
7
|
* metadata placement, idempotency, and binding reconciliation.
|
|
8
8
|
*/
|
|
9
|
-
import { ProxyCheckoutValidationError } from "@proxy-checkout/server-js";
|
|
9
|
+
import { assertCartBuyerReference, ProxyCheckoutValidationError } from "@proxy-checkout/server-js";
|
|
10
10
|
import { ProxyStripeCartSyncError, ProxyStripeOpenCheckoutError } from "./errors.js";
|
|
11
11
|
import { assertCheckoutSessionBelongsToProxy, injectRequiredCheckoutSessionMetadata, } from "./metadata.js";
|
|
12
12
|
import { normalizePsp } from "./psp.js";
|
|
@@ -44,6 +44,9 @@ export async function openCheckout(options) {
|
|
|
44
44
|
let rollbackCart;
|
|
45
45
|
const reconciledCart = await options.reconcileCart?.({ cart, offer, session: proxySession });
|
|
46
46
|
if (reconciledCart) {
|
|
47
|
+
if (options.getCartBuyerReference !== undefined) {
|
|
48
|
+
assertCartBuyerReference(options.getCartBuyerReference(reconciledCart.cart), proxySession);
|
|
49
|
+
}
|
|
47
50
|
const priorCart = {
|
|
48
51
|
amountMinor: proxySession.amountMinor,
|
|
49
52
|
cartSnapshot: proxySession.cartSnapshot,
|
|
@@ -44,26 +44,33 @@ export async function syncCheckoutCart(options) {
|
|
|
44
44
|
expectedCartVersion: session.cartVersion,
|
|
45
45
|
requestId: options.requestId,
|
|
46
46
|
});
|
|
47
|
+
const stripeUpdateParams = {
|
|
48
|
+
line_items: options.buildStripeLineItems(next.cart),
|
|
49
|
+
};
|
|
50
|
+
const stripeUpdateOptions = buildStripeUpdateRequestOptions(options, proxyCartUpdate.cartVersion);
|
|
47
51
|
let updatedCheckout;
|
|
48
52
|
try {
|
|
49
|
-
updatedCheckout = await options.stripe.checkout.sessions.update(options.checkoutSessionId,
|
|
50
|
-
line_items: options.buildStripeLineItems(next.cart),
|
|
51
|
-
}, options.stripeRequestOptions);
|
|
53
|
+
updatedCheckout = await options.stripe.checkout.sessions.update(options.checkoutSessionId, stripeUpdateParams, stripeUpdateOptions);
|
|
52
54
|
}
|
|
53
|
-
catch
|
|
55
|
+
catch {
|
|
54
56
|
try {
|
|
55
|
-
await options.
|
|
56
|
-
amountMinor: prior.amountMinor,
|
|
57
|
-
cartSnapshot: prior.cartSnapshot,
|
|
58
|
-
currency: prior.currency,
|
|
59
|
-
expectedCartVersion: proxyCartUpdate.cartVersion,
|
|
60
|
-
requestId: options.requestId,
|
|
61
|
-
});
|
|
57
|
+
updatedCheckout = await options.stripe.checkout.sessions.update(options.checkoutSessionId, stripeUpdateParams, stripeUpdateOptions);
|
|
62
58
|
}
|
|
63
|
-
catch (
|
|
64
|
-
|
|
59
|
+
catch (retryCause) {
|
|
60
|
+
try {
|
|
61
|
+
await options.proxy.sessions.cart.set(options.proxySessionId, {
|
|
62
|
+
amountMinor: prior.amountMinor,
|
|
63
|
+
cartSnapshot: prior.cartSnapshot,
|
|
64
|
+
currency: prior.currency,
|
|
65
|
+
expectedCartVersion: proxyCartUpdate.cartVersion,
|
|
66
|
+
requestId: options.requestId,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
catch (rollbackCause) {
|
|
70
|
+
throw new ProxyStripeCartSyncError("Stripe checkout update failed after an idempotent retry and the Proxy cart rollback failed; carts may be out of sync.", { cause: retryCause, code: "reconciliation_failed", reconciled: false, rollbackCause });
|
|
71
|
+
}
|
|
72
|
+
throw new ProxyStripeCartSyncError("Stripe checkout update failed after an idempotent retry; the Proxy cart rollback was attempted, but Stripe state may still be ambiguous.", { cause: retryCause, code: "stripe_update_failed", reconciled: false });
|
|
65
73
|
}
|
|
66
|
-
throw new ProxyStripeCartSyncError("Stripe checkout update failed; the Proxy cart was rolled back to its prior state.", { cause, code: "stripe_update_failed", reconciled: true });
|
|
67
74
|
}
|
|
68
75
|
return {
|
|
69
76
|
amountMinor: next.amountMinor,
|
|
@@ -73,6 +80,12 @@ export async function syncCheckoutCart(options) {
|
|
|
73
80
|
currency: next.currency,
|
|
74
81
|
};
|
|
75
82
|
}
|
|
83
|
+
function buildStripeUpdateRequestOptions(options, cartVersion) {
|
|
84
|
+
return {
|
|
85
|
+
...options.stripeRequestOptions,
|
|
86
|
+
idempotencyKey: `proxy-sync-checkout-cart:${options.proxySessionId}:${options.checkoutSessionId}:${cartVersion}`,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
76
89
|
function assertSessionBoundTo(session, checkoutSessionId, psp) {
|
|
77
90
|
if (session.providerCheckoutSessionId !== checkoutSessionId ||
|
|
78
91
|
session.providerCheckoutSessionPsp !== psp) {
|
package/dist/esm/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export declare const proxyCheckoutStripeServerSdkName = "@proxy-checkout/stripe-server-js";
|
|
2
|
-
export declare const proxyCheckoutStripeServerSdkVersion = "0.0.0-pr-76.
|
|
2
|
+
export declare const proxyCheckoutStripeServerSdkVersion = "0.0.0-pr-76.30.1";
|
package/dist/esm/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export const proxyCheckoutStripeServerSdkName = "@proxy-checkout/stripe-server-js";
|
|
2
|
-
export const proxyCheckoutStripeServerSdkVersion = "0.0.0-pr-76.
|
|
2
|
+
export const proxyCheckoutStripeServerSdkVersion = "0.0.0-pr-76.30.1";
|
package/package.json
CHANGED
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"description": "Server-side Stripe adapter for Proxy Checkout: required metadata, provider binding, openCheckout, and cart sync.",
|
|
3
3
|
"license": "MIT",
|
|
4
|
-
"main": "./dist/cjs/index.js",
|
|
5
4
|
"module": "./dist/esm/index.js",
|
|
6
5
|
"name": "@proxy-checkout/stripe-server-js",
|
|
7
6
|
"private": false,
|
|
8
7
|
"sideEffects": false,
|
|
9
8
|
"type": "module",
|
|
10
9
|
"types": "./dist/esm/index.d.ts",
|
|
11
|
-
"version": "0.0.0-pr-76.
|
|
10
|
+
"version": "0.0.0-pr-76.30.1",
|
|
12
11
|
"devDependencies": {
|
|
13
12
|
"@types/node": "^24.12.4",
|
|
14
13
|
"@vitest/coverage-v8": "4.1.7",
|
|
15
14
|
"stripe": "^21.0.1",
|
|
16
15
|
"typescript": "^6.0.3",
|
|
17
16
|
"vitest": "4.1.7",
|
|
18
|
-
"@proxy-checkout/server-js": "0.0.4-pr-76.
|
|
17
|
+
"@proxy-checkout/server-js": "0.0.4-pr-76.30.1"
|
|
19
18
|
},
|
|
20
19
|
"exports": {
|
|
21
20
|
".": {
|
|
@@ -57,5 +56,6 @@
|
|
|
57
56
|
"test:integration": "vitest run --project integration",
|
|
58
57
|
"test:unit": "vitest run --project unit",
|
|
59
58
|
"typecheck": "tsc --noEmit -p tsconfig.json"
|
|
60
|
-
}
|
|
59
|
+
},
|
|
60
|
+
"main": "./dist/cjs/index.js"
|
|
61
61
|
}
|